Sont là, toutes les contenants en C++11?
En particulier, je suis à la recherche d'un blocage de la file d'attente. Est-il une telle chose en C++11? Si non, quelles sont mes options? Je n'ai vraiment pas envie de descendre au niveau de thread me plus. Trop enclin à l'erreur.
- +1, Intéressant Q. Scott Meyers a demandé, dans C++0x jours ici.Il serait intéressant de savoir comment cela a changé de poste C++11.
- Très facile de transformer un standard file d'attente dans une file d'attente de blocage à l'aide de primitives
Vous devez vous connecter pour publier un commentaire.
Selon Diego Dagum à partir de Microsoft Visual C++ Équipe:
La Bibliothèque De Modèles Parallèles (PPL) comprend plusieurs conteneurs qui fournissent thread-safe d'accès à leurs éléments:
Certains échantillons ici.
Également intéressant: http://www.justsoftwaresolutions.co.uk/threading/implementing-a-thread-safe-queue-using-condition-variables.html.
C++11 ne fournit pas de concurrente des conteneurs par lui-même. Cependant, il ya des options de bibliothèque.
Outre ceux déjà mentionnés PPL, n'oubliez pas le Intel TBB bibliothèque.
Il a un concurrent à l'
queue
,hash_map
,set
etvector
mise en œuvre. Mais ce n'est pas seulement un "thread-safe" conteneurs de la bibliothèque, il est également livré avec la version parallèle des algorithmes standard (pour la boucle, réduire, trier,...).Intel TBB site web
Je suis surpris que personne n'a mentionné moodycamel::ConcurrentQueue. Nous avons pu l'utiliser pendant un certain temps et il fonctionne très bien. Il est spécifique à sa mise en œuvre est sans verrouillage, qui donne immédiatement une énorme vitesse. D'autres raisons pour l'utiliser (citant le site officiel):
Quelques repères et les comparaisons sont disponibles ici, ici et ici.
Les containers, les interfaces ont tout simplement pas été conçu avec cet objectif. Pour les interfaces qu'ils utilisent, une serrure visible pour le client est vraiment la seule façon que vous pourriez faire cela, tout en garantissant l'exactitude et les comportements prévisibles. Il serait également terriblement inefficace, parce que le nombre des acquisitions serait très élevé (par rapport à une bonne mise en œuvre).
Solution 1
Passage par valeur (le cas échéant).
Solution 2
De créer un ensemble de simple à visser sur les implémentations que vous pouvez utiliser pour transmettre des conteneurs tout en maintenant une portée de verrouillage (considérer pseudo c++):
alors le visiteur paires de la serrure avec la collection, et puis vous mettez à jour vos interfaces à utiliser (passer par) le type de contenant, le cas échéant. C'est juste un pauvre homme d'extension de classe.
Ce conteneur verrouillé est un exemple simple, et il ya quelques autres variantes. C'est le chemin que j'ai choisi parce qu'il permet vraiment d'utiliser le niveau de granularité qui est idéal pour votre programme, même si pas aussi transparent (syntaxiquement) comme verrouillé méthodes. Il est également relativement facile d'adapter les programmes existants. Au moins, il se comporte de manière prévisible, à la différence des collections avec un verrouillage interne.
Une autre variante serait:
...où un type similaire à
t_locked_collection
pourrait être utilisé pour exposer la collection sous-jacente. Ne signifie pas que l'approche est infaillible, juste fou résistant.Ma version d'un concurrent à l'undordered carte
espace de noms de la simultanéité
{
Il n'y a aucune concurrente des conteneurs en C++11.
Mais l'en-tête suivant la classe fournit simultanées de la file d'attente, la pile et la priorité des conteneurs en utilisant std::deque.
BlockingCollection est un C++11 thread-safe classe de collection qui est calquée sur le .NET BlockingCollection classe.