
On Friday 25 October 2013 09:35:55 Oliver Kowalke wrote:
Hello,
do you confirm that it is valid to store a intrusive_ptr inside an atomic?!
struct X { std::size_t use_count; X() : use_count( 0) {} friend inline void intrusive_ptr_add_ref( X * p) BOOST_NOEXCEPT { ++p->use_count; } friend inline void intrusive_ptr_release( X * p) { if ( 0 == --p->use_count) delete p; } };
X::ptr_t x1( new X() );
X::ptr_t x2( new X() );
boost::atomic< X::ptr_t > av1( x1);
BOOST_ASSERT( av1.compare_exchange_strong( x1, x2) ); BOOST_ASSERT( av1.load() != x1); BOOST_ASSERT( av1.load() == x2);
A type T used in generic template atomic<T> is required to be trivial copy-able, e.g. I think it is trivial copy-able (std::memcpy) only the use_count will not incremented. The memory layout of intrusive_ptr is a raw-pointer so trivial copy-able should be correct.
What do you think?
intrusive_ptr is not trivial-copyable, precisely because it has to operate on the counter. Using memcpy for copying it is not correct. For this reason it is not compatible with atomic<>. You have to use raw pointers with atomic<>.