2014-05-06 3 views
3

J'utilise actuellement la table de hachage simultanée de tbb pour effectuer des insertions simultanées dans une carte de hachage. Chaque clé est une chaîne et une valeur est un vecteur d'entiers. Je voudrais réaliser ce qui suit: lors des insertions, si la clé n'existe pas, je l'insère et ajoute la valeur à son vecteur. S'il existe, j'ajoute simplement la valeur à son vecteur. Après avoir inspecté l'API de mappage de hachage tbb simultanée, j'ai remarqué que les fonctions find et insert ne renvoyaient que des booléens. Alors, comment puis-je retourner un pointeur sur la clé si elle existe?tbb hash map find find & insert

+0

Ai-je répondu à votre question? – Anton

+0

Toutes mes excuses pour le retard dans le marquage de la bonne réponse. Oui tu peux. Merci pour votre aide. Je vois que la communauté tbb est certainement petite! – NewToAndroid

+1

merci :) Oui, [tag: tbb] communauté est assez petit, petit nombre de votes, questions, vues – Anton

Répondre

5

Il existe des méthodes qui nécessitent un accesseur dans leurs arguments. L'accesseur est essentiellement un pointeur couplé à un scoped_lock protégeant l'accès simultané à l'élément. Sans le verrou, un élément peut être modifié simultanément, ce qui entraîne une course de données. Donc, n'utilisez jamais directement un pointeur vers l'élément dans la carte concurr_hash_map (à moins d'être protégé par l'accesseur).

De plus, vous n'avez pas besoin d'une méthode find() pour votre tâche puisque les méthodes insert() créent l'élément s'il n'existe pas.

Selon le Reference manual, la carte de hachage a les méthodes suivantes qui satisferont probablement vos besoins:

bool insert(accessor& result, const Key& key);   // creates new element by default 
bool insert(accessor& result, const value_type& value);// creates new element by copying 

Voici un exemple:

{ 
    hash_map_t::accessor a; 
    hash_map.insert(a, key);  // creates by default if not exists, acquires lock 
    a->second.my_vector.push_back(value); // new or old entry, add to vector anyway 
} // the accessor's lock is released here 
+0

L'accesseur verrouiller un verrou sur un seul enregistrement (mémoire transactionnelle similaire) ou sur toute la carte (toutes les opérations seraient verrouillé comme on le ferait manuellement avec standard std :: unordered_map + std :: lock)? – DuckQueen

+0

Juste un élément est verrouillé par l'accesseur bien sûr. Veuillez noter qu'il s'agit d'un verrou en lecture-écriture, voir const_accessor – Anton