Boost logo

Boost Users :

Subject: Re: [Boost-users] [Thread] barrier destruction after wait() results in assertion
From: Anthony Williams (anthony.ajw_at_[hidden])
Date: 2008-12-03 10:07:48


Peter Klotz <Peter.Klotz_at_[hidden]> writes:

> Boost 1.37.0, Red Hat Enterprise Linux 5 x86_64, gcc 4.1:
>
> The following simple test establishes a barrier with thread count 2.
>
> One of the threads destroys the barrier after returning from
> wait(). This results in sporadic assertions from ~mutex().

> I assume that this usage of barrier is not supported/allowed. One
> cannot assume that the barrier can be destroyed just because the
> corresponding thread returned from wait().
>
> Is this conclusion correct?

You cannot destroy a barrier whilst a thread may be accessing it.

> #include <boost/scoped_ptr.hpp>
> #include <boost/thread/barrier.hpp>
> #include <boost/thread/thread.hpp>
>
> boost::scoped_ptr<boost::barrier> barrier;
>
> void f()
> {
> barrier->wait();
> }
>
> int main(void)
> {
> barrier.reset(new boost::barrier(2));
> boost::thread thread(boost::bind(&f));
> barrier->wait();

At this point, there is no guarantee that f() has started.

> barrier.reset();

So this call may have just destroyed the barrier that f is about to
wait on.

> thread.join();
> return 0;
> }

Anthony

-- 
Anthony Williams
Author of C++ Concurrency in Action | http://www.manning.com/williams
Custom Software Development | http://www.justsoftwaresolutions.co.uk
Just Software Solutions Ltd, Registered in England, Company Number 5478976.
Registered Office: 15 Carrallack Mews, St Just, Cornwall, TR19 7UL, UK

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