Subject: Re: [Boost-bugs] [Boost C++ Libraries] #5727: race condition between ~basic_condition_variable() and notify_all()
From: Boost C++ Libraries (noreply_at_[hidden])
Date: 2011-12-07 01:04:10
#5727: race condition between ~basic_condition_variable() and notify_all()
-------------------------------------+--------------------------------------
Reporter: sbear.powell@⦠| Owner: viboes
Type: Bugs | Status: assigned
Milestone: To Be Determined | Component: thread
Version: Boost 1.46.1 | Severity: Problem
Resolution: | Keywords:
-------------------------------------+--------------------------------------
Comment (by viboes):
Replying to [comment:3 sbear.powell@â¦]:
> That's mostly correct, but it won't deadlock because notifier.wait(lock)
will unlock foo's lock while it's waiting.
>
> So: In 1, foo owns m. In 2, the lamda thread will block until m is
available. In 3, done is false, so notifier.wait(lock) is called--
releasing ownership of m. The lambda proceeds, setting done to true,
unlocking m, and notifying any waiting threads (ie. foo). foo returns from
its call to notifier.wait(), checks done (which is now true) and can
return.
You are right. I forget always that wait unlocks the lock.
> (If you want experimental proof that it doesn't deadlock, try running my
workaround code... the logic is pretty much the same)
>
> Replying to [comment:1 viboes]:
> > I'm surely misunderstanding your code
> >
> >
> > {{{
> > void foo() {
> > condition_variable notifier;
> > mutex m, m2;
> > mutex::scoped_lock lock(m); //1
> > bool done=false;
> > thread t([&]{
> > mutex::scoped_lock lock(m); //2
> > done = true;
> > lock.unlock();
> > notifier.notify_all();
> > });
> > while(!done) notifier.wait(lock); //3
> > }
> > }}}
> >
> >
> > Doesn't this code deadlock. In 1 foo owns the lock m. In 2 the lambda
thread is blocked until the lock variable exits his scope (at the end of
foo). In 3 As done is false thread foo waits for notifier, which can not
be notified by the lambda as blocked.
> >
> > What am I missing?
-- Ticket URL: <https://svn.boost.org/trac/boost/ticket/5727#comment:4> Boost C++ Libraries <http://www.boost.org/> Boost provides free peer-reviewed portable C++ source libraries.
This archive was generated by hypermail 2.1.7 : 2017-02-16 18:50:08 UTC