std::shared_ptr fil de sécurité

J'ai lu que

"Plusieurs threads peuvent lire ou écrire simultanément différents
shared_ptr objets, même lorsque les objets sont des copies qui partagent
propriété". (MSDN: Fil de Sécurité dans la Bibliothèque C++ Standard)

Est-ce à dire que le changement de shared_ptr objet est sûr ?

Pour un exemple, le code suivant considérés comme sûrs:

shared_ptr<myClass> global = make_shared<myClass>();
...

//In thread 1
shared_ptr<myClass> private = global;
...

//In thread 2
global = make_shared<myClass>();
...

Puis-je être sûr dans ce cas que le thread 1 private aura la valeur d'origine de global ou la nouvelle valeur qui le thread 2 affecté, mais de toute façon il va avoir un valide shared_ptr myClass?

==EDIT==

Juste pour expliquer ma motivation. Je veux avoir un pointeur partagé de tenir ma configuration et j'ai un pool de threads pour gérer les demandes.

donc global est la configuration globale.

thread 1 est de prendre la configuration actuelle comme il commence à traiter une demande.

thread 2 est la mise à jour de la configuration. (uniquement s'appliquer aux futures demandes)

Si c'est un travail, je peux mettre à jour la configuration de cette façon sans le casser dans le moyen de traitement de la demande.

  • Plusieurs threads peuvent lire ou écrire simultanément différents shared_ptr objets, Le mot clé est différentes
  • C'était mon idée initiale, mais il semble comme une redondant chose à dire. bien sûr, vous pouvez lire et à écrire à des objets différents...
  • Il n'est pas "offcourse". Le smart pointeur pointe vers une commune helper object mise en œuvre du comptage de référence. Avec une naïveté de la mise en œuvre du comptage de référence sur l'objet d'assistance qui pourrait aller mal. Pourtant, je pense que votre question est bonne et la réponse définitive la plupart de bienvenue.
  • J'ai étendu mon entreprise shared_ptr mise en œuvre à l'appui de weak. Et je peux vous dire, il n'y a pas de façon de le faire thread-safe autres que par l'utilisation complète de sections critiques dans des méthodes qui manipulent le nombre de références. (la partie de la clé est le pluriel ici) Normes shared_ptr utilisation atomique inc/dec et cmp/xch dans la méthode release() pour vérifier contre 0 avant de les supprimer. Ce n'est pas thread-safe en raison de la 2ème ref nombre (la faiblesse de comptage ref). Un faible ref pourrait tourner partagé après le test est réussi, et vous avez un ballants. boom.
  • c'est pourquoi la weak_ptr::lock() fonction utilise compare-and-swap, de sorte qu'il peut savoir qu'il n'a pas si un autre thread décrémenté le décompte à zéro. Soit je suis malentendu exactement ce que vous entendez par "thread-safe" ou votre commentaire est incorrect.
  • Je pense que vous avez compris sur place. Il a été un moment depuis que j'ai pensé à tout cela, alors je suis allé vérifier de nouveau ici: boost.org/doc/libs/1_38_0/boost/detail/... . J'ai le sentiment de l'astuce pour le faire fonctionner est ici: #weak + (#shared != 0) le faible nombre est un peu spécial, et permet de vérifier avant de shared_count destruction dans weak_release(). mon idée naïve de na pas mettre en œuvre ce truc donc atomicality ne pourrais pas être exerced dans ce test.
  • private est un mot-clé, il ne peut pas être utilisé comme un nom de variable

InformationsquelleAutor Roee Gavirel | 2013-01-23