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