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
On Wed, Dec 23, 2015 at 7:44 AM, Éric Malenfant
<eric.malenfant@gmail.com> 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