Maison >développement back-end >C++ >Est-ce que std::shared_ptr est vraiment thread-safe, et qu'en est-il des modifications simultanées de l'objet pointé ?
Thread Safety de std::shared_ptr
La déclaration que vous avez citée de MSDN concernant la sécurité des threads de std::shared_ptr peut être mal interprétée. Cela implique que même si plusieurs threads peuvent lire et écrire simultanément des objets shared_ptr distincts, cela ne garantit pas la sécurité de la modification de l'objet shared_ptr lui-même.
TL;DR :
La sécurité des threads de std::shared_ptr concerne uniquement la gestion de plusieurs pointeurs pointant vers le même objet sous-jacent. Il ne s'étend pas au contenu de l'objet partagé ni aux écritures simultanées sur l'instance shared_ptr.
Répartition :
Un shared_ptr se compose en interne de deux composants :
Exemple :
Dans votre extrait de code, global est un pointeur partagé vers un objet de configuration. Le thread 1 copie global dans son propre pointeur partagé, privé. Si Thread 2 devait par la suite modifier global, private pointerait toujours vers l'objet de configuration d'origine, car le bloc de contrôle n'est pas modifié. Cependant, si Thread 2 attribue un nouvel objet de configuration à global, private restera pointant vers l'objet d'origine.
Thread Safety des objets pointus :
La possibilité de modifier l'objet pointé via plusieurs threads dépend de l'implémentation de l'objet. Dans le cas de votre classe de configuration, si elle autorise des écritures simultanées sans synchronisation, comme l'ajout ou la suppression de paramètres, le code ne serait pas thread-safe.
Solution :
Pour garantir la sécurité des threads pour les modifications d'objets, utilisez des mécanismes de synchronisation tels que std::mutex pour protéger l'accès à l'objet shared_ptr ou à l'objet partagé lui-même.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!