Maison > développement back-end > C++ > Est-ce que std::shared_ptr est thread-safe pour l'objet qu'il gère ?

Est-ce que std::shared_ptr est thread-safe pour l'objet qu'il gère ?

Patricia Arquette
Libérer: 2024-11-15 13:03:02
original
389 Les gens l'ont consulté

Is std::shared_ptr thread-safe for the object it manages?

Dans quelle mesure std::shared_ptr garantit-il la sécurité des threads ?

Questions originales :

  1. Référence le comptage dans std::shared_ptr est garanti sûr pour les threads et indépendant de la plate-forme.
  2. Seul le thread contenant la dernière référence appellera delete sur l'objet partagé.
  3. std::shared_ptr le fait ne fournit aucune sécurité de fil pour l'objet qu'il stocke.

Réponses :

Oui, les deux premières questions sont exactes. Le comptage de références de std::shared_ptr et l'invocation du destructeur sont thread-safe.

La troisième question est également correcte. std::shared_ptr ne garantit pas la sécurité des threads pour l'objet qui y est stocké. L'objet lui-même peut ne pas être thread-safe et, par conséquent, y accéder à partir de plusieurs threads sans synchronisation appropriée pourrait entraîner un comportement indéfini.

Exemple :

Considérez ce qui suit morceau de pseudocode :

// Thread I
shared_ptr<A> a (new A (1));

// Thread II
shared_ptr<A> b (a);

// Thread III
shared_ptr<A> c (a);

// Thread IV
shared_ptr<A> d (a);

d.reset (new A (10));
Copier après la connexion
  • Question : L'appel de reset() dans le fil IV supprimera-t-il l'instance précédente de A créée dans le fil I et la remplacera par une nouvelle instance ?
  • Réponse : Non, seul d pointera vers le nouveau A(10), tandis que a, b et c continueront à pointer vers le A(1) d'origine.

Cela est dû au fait que reset() n'affecte pas les références des autres threads au même objet. d est le seul pointeur partagé qui pointera vers la nouvelle instance, tandis que les autres références (a, b et c) resteront pointant vers l'instance d'origine.

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 de ce site Web
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
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal