Thanks again, Peter. That's about what I expected - a mutex around A::create should do the trick.
Peter Krnjevic Dynalink Technologies "Peter Dimov" <[EMAIL PROTECTED]> wrote in message 000d01c2d138$2d29e7d0$1d00a8c0@pdimov2">news:000d01c2d138$2d29e7d0$1d00a8c0@pdimov2... > 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 > _______________________________________________ Unsubscribe & other changes: http://lists.boost.org/mailman/listinfo.cgi/boost