2012-07-08 2 views
0

Ma question: Pourquoi mon programme gèle-t-il si j'utilise "read only" const_accessors?TBB ThreadingBuildingBlocks comportement étrange

Il semble s'agir d'un verrouillage, à partir de la description de l'API, il semble qu'il soit acceptable d'avoir un accesseur et plusieurs const_accessors, (writer, reader). Peut-être que quelqu'un peut me raconter une histoire différente.

Le but que j'essaie d'atteindre est d'utiliser cette carte de hachage simultanée et de la mettre à la disposition de 10 à 200 threads afin qu'ils puissent rechercher et ajouter/supprimer des informations. Si vous avez une meilleure solution que celle que j'utilise actuellement, vous pouvez aussi poster les alternatives.

tbb::size_t hashInitSize = 1200000; 
concurrent_hash_map<long int,char*> hashmap(hashInitSize); 
cout << hashmap.bucket_count() << std::endl; 

long int l = 200; 
long int c = 201; 

    concurrent_hash_map<long int,char*>::accessor o; 
    concurrent_hash_map<long int,char*>::const_accessor t; 
    concurrent_hash_map<long int,char*>::const_accessor h; 

    cout << "Trying to find 200 "<< hashmap.find(t,200) << std::endl; 

    hashmap.insert(o,l); 
o->second = "testother"; 

TBB Community Tutorial Guide Page 43 décrit le concept de accesseurs

Répondre

1

De l'TBB reference manual:

Un accesseur agit comme un pointeur intelligent à une paire dans un concurrent_hash_map. Il détient un verrou implicite sur une paire jusqu'à ce que l'instance soit détruite ou la méthode release est appelée sur l'accesseur.

Les accesseurs acquièrent un verrou lorsqu'ils sont utilisés. Des accesseurs multiples peuvent exister en même temps. Toutefois, si un programme utilise plusieurs accesseurs simultanément et ne libère pas les verrous, il est susceptible de se bloquer.

Pour éviter les interblocages, relâchez le verrou sur une entrée de mappe de hachage une fois que vous avez terminé d'y accéder.

+0

merci pour votre réponse rapide, donc vous dites que seuls les blocages parce que je n'ai pas plusieurs threads sur elle? Cette structure de données ne devrait-elle pas être utilisable dans un environnement concurrent et ne jamais être bloquée? (ou attend-il simplement que le verrou initial soit libéré?) Cela signifierait qu'il serait permis d'accéder uniquement à la structure de données séquentielle dans un thread spécifique et seulement une fois par thread? –

+0

Vous pouvez accéder à différentes entrées en parallèle, par exemple, un accès parallèle à l'entrée 200 et l'entrée 201 est correcte. Vous ne pouvez pas accéder à une seule entrée en parallèle avec plusieurs threads en utilisant 'accessor'. Votre code essaie d'acquérir la propriété de l'entrée 200, puis d'acquérir à nouveau la propriété de l'entrée 200. C'est comme accéder à l'entrée 200 en parallèle avec deux threads. – Heatsink