Duplicates possibles: strong>
est le C ++ stl std STD :: Set thread-coffre-fort?
Sécurité du fil de la file d'attente STL P> blockQuote>Je suppose que ce n'est pas, je veux juste m'assurer. Signification 2 threads en utilisant
idem strong> std :: deque utilisant std :: deque :: push_back code> ou
push_front code> en même temps. P>
Même question va pour
std :: priority_queue code> et les fonctions
std :: priority_queue :: poussez code> et std :: priority_queue :: pop code> .. p>
Ces conteneurs sont-ils du thread-coffre-fort? Ou je devrais personnellement le programmer pour être en sécurité? P>
tnx beaucoup. P>
3 Réponses :
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. P>
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. P>
du point de STL effectif de Scott MyER 12. Ayez des attentes réalistes sur la sécurité du fil de conteneurs STL P>
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. P>
Plusieurs écrivains à différents conteneurs sont en sécurité. Les threads multiples peuvent écrire simultanément sur différents conteneurs. P>
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. P> blockQuote>
"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.
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. p>
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. P>
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. P>
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. P>
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.
Duplicaté possible - Stackoverflow.com/ Questions / 1362110 / ...