On Wed, Sep 10, 2003 at 04:13:37PM +0100, Philip Martin wrote:
> mark benedetto king <mbk@lowlatency.com> writes:
>
> > wait(cond,mutex):
> > acquire(cond->mutex)
> > cond->num_waiters++
> > release(cond->mutex)
> > release(mutex)
> > down(cond->sem)
> > up(cond->ack)
> > acquire(mutex)
> >
> > deliver(cond,count):
> > up(cond->sem, count)
> > down(cond->ack, count)
> > count->num_waiters -= count
> >
> > signal(cond):
> > acquire(cond->mutex)
> > deliver(cond, min(1, cond->num_waiters))
> > release(cond->mutex)
> >
> > broadcast(cond):
> > acquire(cond->mutex)
> > deliver(cond, cond->num_waiters);
> > release(cond->mutex)
>
> thread 1 waits
> thread 2 waits
> thread 3 broadcasts
> thread 1 wakes up and runs
> thread 1 acquires mutex and calls wait
> thread 1 blocks waiting for cond->mutex held by thread 3
> thread 2 tries to wake up but blocks waiting for mutex held by thread 1
Aha! I knew there was something suspicious about the use of mutex.
What if we were to move "release(mutex)" to the first line of wait()?
--ben
---------------------------------------------------------------------
To unsubscribe, e-mail: dev-unsubscribe@subversion.tigris.org
For additional commands, e-mail: dev-help@subversion.tigris.org
Received on Wed Sep 10 17:34:12 2003