Il faut faire attention qu'il y a 2 attributs manipulés par un shared_ptr :
Le pointeur vers l'objet
Le compteur de référence
La garantie identique au type pointeur de base que tu évoque dans le premier paragraphe concerne l'accès au pointeur (par exemple les fonctions get(), reset(), operator*())
Le point que tu évoque sur l'aspect lock-free concerne le compteur de référence. C'est à dire que plusieurs threads peuvent copier le shared_ptr, puis détruire des shared_ptrs, l'accès au compteur de référence est protégé par l'utilisation de fonctions atomiques (lorsque le CPU et boost les gèrent).
[^] # Re: templates variadiques
Posté par Étienne . En réponse à la dépêche Le standard C++0x a enfin été voté. Évalué à 1.
Il faut faire attention qu'il y a 2 attributs manipulés par un shared_ptr :
La garantie identique au type pointeur de base que tu évoque dans le premier paragraphe concerne l'accès au pointeur (par exemple les fonctions get(), reset(), operator*())
Le point que tu évoque sur l'aspect lock-free concerne le compteur de référence. C'est à dire que plusieurs threads peuvent copier le shared_ptr, puis détruire des shared_ptrs, l'accès au compteur de référence est protégé par l'utilisation de fonctions atomiques (lorsque le CPU et boost les gèrent).
On peut regarder sur boost/smart_ptr/shared_ptr.hpp que la classe shared_ptr contient 2 membres :
C'est cette deuxième classe qui utilise des fonctions atomiques définies dans sb_counted_base, on peut par exemple regarder boost/smart_ptr/detail/sp_counted_base_sync.hpp qui utilise les fonctions fournies par gcc (voir Atomic-Builtins).
Étienne