En C++, est-il prudent d'utiliser simultanément un std :: map ou un std :: vector dans différents threads si vous n'insérez PAS, en effectuant simplement des opérations .find() dessus?Est-il prudent d'utiliser des conteneurs STL C++ sur plusieurs threads si ce n'est pas des insertions et seulement .find()?
Répondre
Oui. Aucun changement de mémoire ou de mise en cache ne se produira sous le capot.
Ceci est spécifique à l'implémentation et n'est pas garanti par la norme.
Dans quelle implémentation cela ne fonctionnerait-il pas? – Jay
Je pense que sergiom est probablement juste dans la pratique, mais comme je n'ai trouvé aucune garantie, je suppose que ce n'est pas quelque chose sur lequel nous pouvons compter. –
@Jay: En principe, un conteneur peut reporter certaines tâches de nettoyage jusqu'à un accès ultérieur. Ce n'est pas parce que le conteneur est accessible logiquement que const ne garantit pas qu'il ne retournera pas certains bits (d'une manière non sécurisée) sous le capot. –
Le standard C++ actuel n'a rien à dire sur le sujet du threading, et ne résout donc pas ce problème. La documentation pour votre implémentation de bibliothèque standard C++ spécifique devrait cependant le couvrir.
À partir de VC++ (Visual Studio 2008), en référence aux conteneurs std: un seul objet peut être lu en toute sécurité à partir de plusieurs threads. Par exemple, étant donné un objet A, il est sûr de lire A à partir du thread 1 et du thread 2 simultanément. – Permaquid
Vous faites l'hypothèse que la méthode find n'est pas active pour toutes les implémentations de la norme. Il est préférable de ne pas faire d'hypothèses en ce qui concerne C++. – JaredPar