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