Re: [Boost-users] Race in boost::condition_variable::wait
Not sure I understand your question.
Unless I'm missing something, the guard in condition_variable::wait does
not release the mutex, it is simply there to ensure that it is reacquired
on exit. The mutex is released by pthread_cond_wait (atomically with the
wait on the condition).
Éric Malenfant
Le 2015-12-22 8:30 PM, "Chris Stankevitz"
On Wed, Dec 23, 2015 at 7:44 AM, Éric Malenfant
Unless I'm missing something, the guard in condition_variable::wait does not release the mutex, it is simply there to ensure that it is reacquired on exit. The mutex is released by pthread_cond_wait (atomically with the wait on the condition).
Eric, Thank you for your reply. I believe you are incorrect that the guard only reacquires (and does not release) the mutex. The line "guard.activate(m);" indeed releases the user mutex before pthread_cond_wait (see below). You are correct that pthread_cond_wait atomically releases the mutex -- but it is releasing the internal boost mutex, not the "external" user mutex which has already been released by the guard. I assume that I am missing something, but I cannot figure out what it is. Chris === template<typename MutexType> struct lock_on_exit { MutexType* m; lock_on_exit(): m(0) {} void activate(MutexType& m_) { m_.unlock(); m=&m_; } ~lock_on_exit() { if(m) { m->lock(); } } };
You're right and I was doubly wrong: the guard locks the mutex on
activate() and I totally missed the point about the "internal vs external
mutex".
(Note to self: don't try to read code on your tiny smartphone screen)
However, I still don't understand your question. The thread releases the
external mutex while holding the internal, and notify_all acquires the
internal before notifying the condition.
Éric Malenfant
Le 2015-12-23 12:19 PM, "Chris Stankevitz"
On Wed, Dec 23, 2015 at 7:44 AM, Éric Malenfant
wrote: Unless I'm missing something, the guard in condition_variable::wait does not release the mutex, it is simply there to ensure that it is reacquired on exit. The mutex is released by pthread_cond_wait (atomically with the wait on the condition).
Eric,
Thank you for your reply.
I believe you are incorrect that the guard only reacquires (and does not release) the mutex. The line "guard.activate(m);" indeed releases the user mutex before pthread_cond_wait (see below).
You are correct that pthread_cond_wait atomically releases the mutex -- but it is releasing the internal boost mutex, not the "external" user mutex which has already been released by the guard.
I assume that I am missing something, but I cannot figure out what it is.
Chris
===
template<typename MutexType> struct lock_on_exit { MutexType* m;
lock_on_exit(): m(0) {}
void activate(MutexType& m_) { m_.unlock(); m=&m_; } ~lock_on_exit() { if(m) { m->lock(); } } }; _______________________________________________ Boost-users mailing list Boost-users@lists.boost.org http://lists.boost.org/mailman/listinfo.cgi/boost-users
On Wed, Dec 23, 2015 at 3:02 PM, Éric Malenfant
However, I still don't understand your question. The thread releases the external mutex while holding the internal, and notify_all acquires the internal before notifying the condition.
Eric, Thank you again. I did not understand that boost::condition_variable::notify locked the internal mutex. I now see how it all works and that indeed there is no race. Chris
participants (2)
-
Chris Stankevitz
-
Éric Malenfant