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" <chrisstankevitz@gmail.com> a écrit :
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