threads/128180: pthread_cond_broadcast() lost wakup
deischen at freebsd.org
Fri Oct 17 23:45:00 UTC 2008
On Fri, 17 Oct 2008, Kurt Miller wrote:
> The test program outputs periodic printf's indicating
> progress is being made. When it stops the process is
> deadlocked. The lost wakeup can be confirmed by inspecting
> the saved_waiters local var in main(). Each time the
> deadlock occurs I see that saved_waiters is 8 which tells
> me all eight worker threads were waiting on the condition
> variable when the broadcast was sent. Then switch to the
> thread that is still waiting on the condition variable,
> and you can see that the last_cycle local var is one behind
> the cycles global var which indicates it didn't receive the
> last wakeup.
The test program doesn't look correct to me. It seems possible
for only a few of the threads (as little as 2) to do all the
work. Thread 1 can start doing work, then wait for a broadcast.
Thread 2 can start doing his work, then broadcast waking thread 1.
I think you need separate condition variables, one to wake up
the main thread when the last worker goes to sleep/finishes,
and one to wake up the workers.
More information about the freebsd-threads