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é ?

Est-ce que std::shared_ptr est vraiment thread-safe, et qu'en est-il des modifications simultanées de l'objet pointé ?

Patricia Arquette
Patricia Arquetteoriginal
2024-11-17 03:44:03549parcourir

Is std::shared_ptr truly thread-safe, and what about concurrent modifications to the pointed object?

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 :

  • Bloc de contrôle : gère le nombre de références du shared_ptr et assure la destruction appropriée de l'objet pointé. Ce composant est thread-safe.
  • Objet pointu : la structure de données réelle ou l'objet partagé. La sécurité des threads de cet objet dépend de son implémentation.

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!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn