Boost logo

Boost Users :

Subject: [Boost-users] weak_ptr::lock is not thread safe
From: Dmytro Ovdiienko (dmitriy.ovdienko_at_[hidden])
Date: 2010-12-16 10:43:45


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


Boost-users list run by williamkempf at hotmail.com, kalb at libertysoft.com, bjorn.karlsson at readsoft.com, gregod at cs.rpi.edu, wekempf at cox.net