12
votes

Utilise STD :: DEQUE ou STD :: Priority_Queue thread-coffre-fort?

Duplicates possibles:

est le C ++ stl std STD :: Set thread-coffre-fort?
Sécurité du fil de la file d'attente STL

Je suppose que ce n'est pas, je veux juste m'assurer. Signification 2 threads en utilisant idem std :: deque utilisant std :: deque :: push_back ou push_front en même temps.

Même question va pour std :: priority_queue et les fonctions std :: priority_queue :: poussez et std :: priority_queue :: pop ..

Ces conteneurs sont-ils du thread-coffre-fort? Ou je devrais personnellement le programmer pour être en sécurité?

tnx beaucoup.


1 commentaires

3 Réponses :


3
votes

La STL ne fournit aucune garantie pour la sécurité du fil. Ceci est particulièrement le cas lors de la modification du même conteneur de plusieurs threads.

La mise en œuvre de la STL que vous utilisez peut fournir un certain niveau de sécurité de thread, mais vous devez examiner la documentation de votre implémentation.


0 commentaires

16
votes

du point de STL effectif de Scott MyER 12. Ayez des attentes réalistes sur la sécurité du fil de conteneurs STL

Plusieurs lecteurs sont sûrs. Les threads multiples peuvent simultanément lire le contenu d'un seul conteneur, ce qui fonctionnera correctement. Naturellement, il ne doit pas y avoir d'écrivains agissant sur le conteneur pendant les lectures.

Plusieurs écrivains à différents conteneurs sont en sécurité. Les threads multiples peuvent écrire simultanément sur différents conteneurs.

Lorsqu'il s'agit de filer des conteneurs en toute sécurité et des conteneurs STL, vous pouvez espérer une implémentation de la bibliothèque qui permet plusieurs lecteurs. sur un conteneur et plusieurs écrivains sur des conteneurs séparés. Vous n'hésitez pas à espérer que la bibliothèque élimine le besoin de contrôle manuel de la concurrence et vous ne pouvez pas compter sur un support de thread du tout.


2 commentaires

"Espoir" n'est pas un mot que j'aime voir dans les attentes de la sécurité du fil;)


Comme philosophiquement pertinent que cette citation peut être, elle est sans aucun soupçon de praticité. Pour autant que je sache pour une implémentation de l'acquée stl, je sais que c'est également incorrect de la lecture et de l'écriture.



1
votes

Lorsque vous dites, sont-ils en sécurité, vous voulez supposer que vous pouvez les utiliser dans plusieurs threads sans avoir à verrouiller quoi que ce soit.

En théorie, vous pouvez potentiellement avoir 2 threads, l'un en poussant à l'arrière et un à l'avant, et vous vous en sortirez probablement bien que je ne serais pas méfiant parce que la mise en œuvre n'est pas sous garantie de la faire vitrée Comme les itérateurs deviennent invalidés avec des insertions à l'une ou l'autre extrémité, si la mise en œuvre de Push_back a utilisé "End" et de Push_front utilisé "Begin", telle serait invalidée dans l'appel par l'autre thread et pourrait vous faire exploser.

std :: priority_queue n'est presque certainement pas utilisable dans deux threads ensemble, vraisemblablement pour les fils de producteurs / consommateurs, avec un poussoir et une apparition et vous aurez besoin de verrouiller en premier.

J'ai trouvé que lorsque j'ai écrit une file d'attente de producteur / consommateur basée autour de STD :: Deque, j'ai permis au producteur de pousser plus d'un élément à la fois et le consommateur de balayer toute la file d'attente. Cela signifiait qu'une seule serrure par insert en vrac, ainsi réduit le nombre de fois dont vous aviez besoin pour verrouiller.


1 commentaires

Selon les itérateurs de CPPReference, les itérateurs sont "toujours" invalidés par STD :: DEQUE :: PUSH_BACK ET.AL. EN.CPPREFERFERFERATION.COM/W/CPP/CONTAINER/DEQU . Ce sont des pointeurs et des références aux éléments qui ne sont pas invalidés.