threads/128180: pthread_cond_broadcast() lost wakup
Daniel Eischen
deischen at freebsd.org
Sat Oct 18 00:00:10 UTC 2008
The following reply was made to PR threads/128180; it has been noted by GNATS.
From: Daniel Eischen <deischen at freebsd.org>
To: Kurt Miller <kurt at intricatesoftware.com>
Cc: freebsd-gnats-submit at freebsd.org, freebsd-threads at freebsd.org
Subject: Re: threads/128180: pthread_cond_broadcast() lost wakup
Date: Fri, 17 Oct 2008 19:44:58 -0400 (EDT)
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.
--
DE
More information about the freebsd-threads
mailing list