2016-10-25 1 views
3

Je sais que la copie et la réinitialisation d'un seul shared_ptr dans 2 threads distincts est problématique, mais qu'en est-il de 2 threads qui tentent de créer une copie du même objet shared_ptr. A-t-il besoin de synchronisation? Le compteur de référence fonctionnera-t-il correctement ici?Puis-je copier un seul shared_ptr simultanément?

std::shared_ptr<T> global_t(new T()); 

// Thread 1 
std::shared_ptr<T> t1(global_t); 
do something with t1 

// Thread 2 
std::shared_ptr<T> t2(global_t); 
do something with t2 

Répondre

9

A l » refcount is synchronizedstd::shared_ptr, la copie si simultanée est ok (mais peut-être moins performant). Et l'objet géré n'est libéré que lorsque son refcount tombe à zéro.

+1

et c'est exactement pourquoi 'std :: shared_ptr' viole le principe C++" vous ne payez pas pour ce que vous n'utilisez pas ". L'incrément/décrément atomique (utilisé pour le comptage de référence) est plus lent et non requis si shared_ptr est utilisé à partir d'un seul thread, mais 'std :: shared_ptr' ne fournit pas de paramètre de modèle pour utiliser un compteur de référence monothread. –

+2

@AndyT Oui. On peut dire que c'était toujours la bonne décision. Peut être. Aucune idée à quel point une deuxième variante aurait été coûteuse ... – Deduplicator

+2

Non. Copier et réinitialiser le même objet 'shared_ptr' à partir de différents threads sans synchronisation est une course de données et donc UB. L'accès au bloc de contrôle est synchronisé, pas l'objet 'shared_ptr' lui-même. C'est pourquoi il y a toutes ces fonctions 'atomic_ *' pour quand vous avez réellement besoin d'opérer sur le même objet 'shared_ptr' atomiquement. –