[intrusive_ptr] adding thread safety

Hello, A naive usage of intrusive_ptr involves having a refcount embedded in the pointed to object and providing add_red and release functions like: void intrusive_ptr_add_ref(const my_class* p) { ++(p->ref); } template<typename T> void intrusive_ptr_release(const my_class* p) { if(--(p->ref)==0){ // whatever } } But, AFAICS, this is not thread safe, as intrusive_ptr itself does not add any thread safety layer. So my question is how to efficiently provide add_ref and release functions which are thread safe (wrt to refcounting)? I can use a class-level boost::detail::lightweight_mutex in the obvious way, but I understand shared_ptr uses much more advanced mechanisms and maybe these are available for (semi)public consuption at boost/detail. Thank you, Joaquín M López Muñoz Telefónica, Investigación y Desarrollo

JOAQUIN LOPEZ MU?Z wrote:
Hello,
A naive usage of intrusive_ptr involves having a refcount embedded in the pointed to object and providing add_red and release functions like:
void intrusive_ptr_add_ref(const my_class* p) { ++(p->ref); }
template<typename T> void intrusive_ptr_release(const my_class* p) { if(--(p->ref)==0){ // whatever } }
But, AFAICS, this is not thread safe, as intrusive_ptr itself does not add any thread safety layer. So my question is how to efficiently provide add_ref and release functions which are thread safe (wrt to refcounting)? I can use a class-level boost::detail::lightweight_mutex in the obvious way, but I understand shared_ptr uses much more advanced mechanisms and maybe these are available for (semi)public consuption at boost/detail.
An atomic counter should suffice. boost::detail::atomic_count.

Maxim Yegorushkin ha escrito:
JOAQUIN LOPEZ MU?Z wrote:
[...]
So my question is how to efficiently provide add_ref and release functions which are thread safe (wrt to refcounting)? I can use a class-level boost::detail::lightweight_mutex in the obvious way, but I understand shared_ptr uses much more advanced mechanisms and maybe these are available for (semi)public consuption at boost/detail.
An atomic counter should suffice. boost::detail::atomic_count.
That's it! Thank you very much, Joaquín M López Muñoz Telefónica, Investigación y Desarrollo
participants (3)
-
JOAQUIN LOPEZ MU?Z
-
Joaquín Mª López Muñoz
-
Maxim Yegorushkin