Dans quelle mesure std::shared_ptr garantit-il la sécurité des threads ?
Comprendre la sécurité des threads de std::shared_ptr est crucial pour les opérations simultanées programmation. Voici un examen détaillé de vos questions :
1. La norme garantit que le comptage de références est géré de manière thread-safe et qu'il est indépendant de la plate-forme, n'est-ce pas ?
Oui, c'est correct. Le nombre de références est géré de manière atomique, garantissant un fonctionnement thread-safe quelle que soit la plate-forme sous-jacente.
2. Problème similaire : la norme garantit qu'un seul thread (contenant la dernière référence) appellera delete sur l'objet partagé, n'est-ce pas ?
Oui, c'est également vrai. La norme garantit que lorsque la dernière référence à un objet partagé est publiée, un seul thread appellera le destructeur, garantissant ainsi la destruction de l'objet sans conditions de concurrence.
3. Shared_ptr ne garantit aucune sécurité des threads pour l'objet qui y est stocké ?
Correct. std::shared_ptr fournit la sécurité des threads pour la gestion des pointeurs et du nombre de références, mais il ne garantit pas la sécurité des threads de l'objet sous-jacent lui-même. La sécurité des threads de l'objet dépend de son implémentation.
Exemple :
Considérez le pseudo-code suivant :
// 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));
Contrairement à votre hypothèse, après avoir appelé reset() dans le thread IV, d pointera vers le A(10) nouvellement créé, tandis que a, b et c continueront à pointer vers le A(1) d'origine. Ce comportement est illustré dans le code suivant :
#include <memory> #include <iostream> struct A { int a; A(int a) : a(a) {} }; int main() { shared_ptr<A> a(new A(1)); shared_ptr<A> b(a), c(a), d(a); cout << "a: " << a->a << "\tb: " << b->a << "\tc: " << c->a << "\td: " << d->a << endl; d.reset(new A(10)); cout << "a: " << a->a << "\tb: " << b->a << "\tc: " << c->a << "\td: " << d->a << endl; return 0; }
Sortie :
a: 1 b: 1 c: 1 d: 1 a: 1 b: 1 c: 1 d: 10
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!