J'ai un objet global contenant plusieurs objets std :: map C++. Cet objet est supposé être lu uniquement dans un environnement multithread. Mais je ne suis pas sûr qu'il y ait une opération d'écriture quand un objet std :: map C++ est lu dans l'implémentation de std :: map. L'IDE est Visual Studio 2008. Dois-je fournir des mécanismes de synchronisation pour les opérations de lecture?Est-il sûr de lire un seul objet std :: map C++ par différents threads simultanément sans mécanismes de synchronisation?
Répondre
Oui, cela sera OK à condition que personne n'écrive sur la carte. Voir ici pour plus de détails.
Il existe au moins un problème "portable", en ce sens que si vous utilisez operator[]
pour lire, ce n'est pas nécessairement une opération en lecture seule car si l'élément n'existe pas encore sur la carte, il sera créé. Au-delà, cela devient une question de mise en œuvre spécifique.
"opérateur []" est ce que j'utilise. Je le réparerai. – MasterBeta
True. J'ai eu cela dans mon code, mais rapidement changé en une méthode const en utilisant find() avec un const_insterator. – tkarls
Si vous utilisez l'opérateur d'indexation, alors non. Il y a une chance que l'opérateur d'indice (map [1]) modifie la structure de la carte. Cependant, si vous utilisez la méthode find avec const_iterators, il est raisonnable de le faire en toute sécurité. N'oubliez pas que tous ces itérateurs peuvent devenir invalides si la carte est modifiée. Cela dit, il s'agit probablement encore d'une idée non sûre.
Voir here pour les détails de la bibliothèque std livré avec VC++ 2008:
Un seul objet est thread-safe pour la lecture de plusieurs threads. Pour par exemple, étant donné un objet A, il est sûr de lire A à partir du fil 1 et du fil simultanément.
Il n'y a pas de règles concernant la sécurité des threads des conteneurs std, cela dépend des développeurs de bibliothèques. Vérifiez donc toujours la documentation de votre implémentation std spécifique.
+1 pour le lien. – JoshD
+ 1 pour être la seule réponse correcte ... yikes! –
@Tony: pouvez-vous être plus précis quant à ce qui ne va pas avec les autres réponses? –