Pointeurs partagés et sécurité des threads reconsidérés
La sécurité des threads de std::shared_ptr a fait l'objet de nombreuses discussions parmi les programmeurs C. Examinons les détails les plus fins pour clarifier sa véritable nature.
Attention : ce que MS pourrait signifier
La déclaration de MSDN que vous avez mentionnée peut être trompeuse. Oui, plusieurs threads peuvent lire et écrire différents objets shared_ptr sans problème. Cependant, cela s'applique uniquement au bloc de contrôle qui gère le nombre de références de l'objet partagé. Cela ne signifie pas que la modification du contenu de l'objet partagé est sûre.
Le privilège du bloc de contrôle
Le bloc de contrôle lui-même, qui coordonne le comptage de références thread-safe est en effet thread-safe. Cela vous permet de créer et de détruire des instances shared_ptr simultanément sans vous soucier de la corruption des données. Cependant, l'objet vers lequel ils pointent est une autre histoire.
Accès à l'objet partagé : procédez avec prudence
Dans l'exemple que vous avez fourni :
shared_ptr<myClass> global = make_shared<myClass>();
C'est parfaitement adapté à la gestion du comptage de références thread-safe. Cependant, les lignes suivantes :
shared_ptr<myClass> private = global; global = make_shared<myClass>();
sont dangereuses si plusieurs threads accèdent simultanément à ces instances shared_ptr. Modifier le global peut potentiellement déstabiliser le privé. La valeur à laquelle elle fait référence peut devenir invalide ou corrompue.
Le besoin de synchronisation
Pour garantir un accès sécurisé aux threads à l'objet réel pointé par shared_ptr, vous avez besoin d'un mécanisme de synchronisation séparé. Une approche courante consiste à utiliser un mutex ou un verrou pour protéger toute opération modifiant l'objet partagé. De cette façon, un seul thread peut le modifier à la fois, évitant ainsi la corruption des données.
Conclusion
N'oubliez pas que std::shared_ptr sert principalement à coordonner le comptage de références entre plusieurs copies. Cela ne rend pas comme par magie l'objet sous-jacent thread-safe. Par conséquent, lorsque vous accédez et modifiez des objets partagés, utilisez toujours des techniques de synchronisation de threads appropriées pour éviter les problèmes potentiels.
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!