2012-01-17 2 views
1

J'ai un modèle de poids mouche travaillant en série où l'usine utilise std::map pour stocker et donner accès aux objets créés. L'usine renvoie un iterator qui pointe vers l'objet dans la carte. Les objets de l'usine sont des constantes, ils ne seront donc pas mis à jour une fois insérés, à moins qu'ils ne soient effacés.Usine simultanée/poids mouche avec TBB

Je voudrais faire l'usine concurrente en utilisant tbb::concurrent_hash_map, mais je ne suis pas sûr de ce que le retour devrait être. Je pourrais utiliser un iterator (devrait-il être const_iterator?), Mais la documentation indique que tous les itérateurs sont invalidés quand quelque chose fait un find ou insert dans le concurrent_hash_map. Donc, je pourrais utiliser un const_accessor puisque seul l'accès en lecture seule est nécessaire, mais cela est différent de l'implémentation en série (iterator vs accessor).

Lequel est le meilleur à utiliser? La cohérence des types (c.-à-d. Les deux itérateurs) devrait-elle être importante? Les options de compilation et de threads en série doivent être présentes.

+0

Je pense que forcer la mise en œuvre en série et en parallèle dans un concept n'est jamais bon. – inf

Répondre

2

Si vous n'effacez pas simultanément des éléments avec d'autres threads accédant à la map, vous pouvez utiliser tbb::concurrent_unordered_map à la place. C'est aussi un conteneur associatif basé sur le hachage, mais avec une API plus simple et plus proche de la STL. Il ne pas invalider les itérateurs par insert et find, mais comme un compromis, il ne permet pas la suppression simultanée des éléments.

Si vous devez supprimer simultanément des éléments, le seul choix avec TBB est d'utiliser tbb::concurrent_hash_map avec des accesseurs.

Je vous suggère également de discuter de votre cas d'utilisation au the TBB forum.