dynalink wrote:
> Works great! How thread safe is this?

Looks as thread safe as your version, where you could end up calling
m_X.reset(new X) simultaneosly if two threads created a B at the same time.
IOW, not much. :-)

All shared_ptr/weak_ptr operations have the same thread safety level, i.e.
multiple reads are safe, writes need to be exclusive.

You'll probably need a mutex lock in A::create to make B thread-neutral.

> "Peter Dimov" <[EMAIL PROTECTED]> wrote in message
> 001301c2d12c$30c1d210$1d00a8c0@pdimov2">news:001301c2d12c$30c1d210$1d00a8c0@pdimov2...
>> dynalink wrote:
>>> I need to create a single instance of  X and have it disappear when
>>> the
>>> final B pointer goes out of scope. The problem with this code is
>>> that A::m_X immediately bumps the ref count and only goes out of
>>> scope on termination.
>>>
>>> Here's a simple example:
>>>
>>> class X;    // defined elsewhere; in my case wraps a classic C
>>> structure. typedef boost::smart_ptr<X> X_ptr;
>>>
>>> struct A {
>>>     static X_ptr create() { if (!m_X.get()) m_X.reset(new X); return
>>>     m_X; } static X_ptr m_X;
>>> };
>>>
>>> struct B {
>>>     B() : m_A(A::create()){}
>>>     X_ptr m_A;
>>> };
>>
>> You need to keep a weak_ptr in A.
>>
>> struct A
>> {
>>     static X_ptr create()
>>     {
>>         if(X_ptr px = make_shared(wp_))
>>         {
>>             return px;
>>         }
>>         else
>>         {
>>             X_ptr px(new X);
>>             wp_ = px;
>>             return px;
>>         }
>>     }
>>
>>     static weak_ptr<X> wp_;
>> };

_______________________________________________
Unsubscribe & other changes: http://lists.boost.org/mailman/listinfo.cgi/boost

Reply via email to