This is the mail archive of the
mailing list for the pthreas-win32 project.
Why does cond_signal not block until a waiter is woken like cond_broadcast does?
- From: "Reddie, Steven" <Steven dot Reddie at ca dot com>
- To: pthreads-win32 at sources dot redhat dot com
- Date: Fri, 25 Oct 2002 16:43:05 +1000
- Subject: Why does cond_signal not block until a waiter is woken like cond_broadcast does?
Hi, I don't think I've found a bug but am just wondering about the behaviour
of the condition variables.
pthread_cond_broadcast doesn't return until all waiters have woken. This
would seem to stop any new waiters from grabbing the semaphore meant for an
existing waiter, since the mutex is held for the duration of
pthread_cond_broadcast. This would also seem to stop any subsequent
broadcast or signal calls from other threads while the first is in progress.
If pthread_cond_broadcast returned before the waiters have all woken up then
further logic would be needed to both stop further broadcasts from
interfering with the current one, and to stop new waiters from waking on the
current broadcast thereby starving an existing waiter. I think I've figured
out the required code changes, but I don't know if this is desireable
However, pthread_cond_signal does not do this, it simply increments the
semaphore count and immediately returns. This makes me think that there is
a potential problem if a few signal calls are followed by a broadcast call
without any of the waiting threads waking in between. To illustrate:
* threads 1-5: all waiting on the same condition variable (waiters now = 5)
* thread 0: pthread_cond_signal (semaphore incremented to 1, waiters still =
* thread 0: pthread_cond_signal (semaphore incremented to 2, waiters still =
* thread 0: pthread_cond_signal (semaphore incremented to 3, waiters still =
* thread 0: pthread_cond_broadcast (waiters = 5, so sempahore is incremented
by 5, to 8)
If this is what happens then this would result in a deadlock, because no
more waiters can be added while cond_broadcast holds the lock, but until a
further 3 waiters come along the cond_broadcast call cannot complete.
Surely I'm missing something, but please let me know either way.
Also, I can't determine from the POSIX docs if pthread_cond_broadcast must
be implemented in such a way that it blocks until all waiters have woken. I
assume this means it isn't specified, but if anyone knows please let me
Steven Reddie <Steven.Reddie@ca.com>
Development Leader - eTrust ETPKI
Computer Associates Pty Ltd (Australia)