Re: pthread_cond_signal/broadcast: necessary to hold mutex?

Jörg Sonnenberger <[email protected]> Tue, 24 Mar 2026 18:13:47 +0100
Newsgroups gmane.os.netbsd.current
Message-ID <[email protected]>
On 3/23/26 9:50 PM, Thomas Klausner wrote:
>       In this implementation, none of the functions enforce this
>       requirement, but if the mutex is not held or independent mutexes
>       are used the resulting behaviour is undefined.

The core design of condition variables with two threads A and B is as 
following.

Thread A does something like:
   acquire_mutex()
   for (;;) {
     if (!has_work())
       cv_wait();
     do_work();
   }

Thread B does something like:
   // Without mutex
   add_work();
   cv_signal();

Now add_work and has_work are not serialized because B doesn't hold the 
mutex. If thread A has just finished has_work, it is luck whether the 
cv_wait is run before or after cv_signal. If it is run after, you have 
potentially a dead lock condition. Requiring the mutex completely avoids 
the problem.

Now in principle there could be outside conditions that ensures the same 
constraints, but experience has shown that not to be true way too often. 
We used to assert this, but gave up after too many complains.

Joerg