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
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. –
@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
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. –