Hi All,

I've just realized weak_ptr::lock is not thread safe. Is it expected behavior? Following sample reproduced this conclusion.

#include <iostream>

#include <boost/shared_ptr.hpp>
#include <boost/thread.hpp>
#include <boost/weak_ptr.hpp>
#include <boost/interprocess/detail/atomic.hpp>
#include <boost/interprocess/sync/interprocess_semaphore.hpp>

static volatile int v = 0;

boost::interprocess::interprocess_semaphore s1(0);
boost::interprocess::interprocess_semaphore s2(0);
boost::interprocess::interprocess_semaphore s3(0);


class SomeClass{
public:
    boost::shared_ptr<SomeClass> s_this_;
    boost::weak_ptr<SomeClass> w_this_;
   
    SomeClass()
    {
        s_this_.reset( this );
        w_this_ = s_this_;
   
        v = 1;
    }

    void release()
    {
        s_this_.reset();
    }

    ~SomeClass()
    {
        v = 0;
    }
};

SomeClass *c;

void worker()
{
    int counter = 0;
    for( ;; )
    {
        s1.wait();                                      // wait for created object
        boost::weak_ptr<SomeClass> w = c->w_this_;      // make weak ptr

        s2.post();                                      // let main thread go ahead
        boost::shared_ptr<SomeClass> s = w.lock();      // create shared_ptr from weak_ptr
   
        if( s )                                         // test for valid shared_ptr
        {
            if( 0 == v )                                // if 0, object is destroyed
            {
                std::cout << "!!!!!!!! : " << counter << std::endl;
                exit(1);
            }
        }
   
        s3.post();                                      // notify main thread about test completion
        ++counter;                     
    }
   
}

int main()
{
    boost::thread t = boost::thread( &worker );
   
    for( ;; )
    {
        c = new SomeClass();    // create object
        s1.post();              // notify thread about new object

        s2.wait();              // wait for thread to make weak_ptr
        c->release();           // destroy object

        s3.wait();              // wait for thread complete
    }

    return 0;
}

Best regards.

Dima

--
Dmytro Ovdiienko