11 Aug
2008
11 Aug
'08
7:56 p.m.
On Mon, Aug 11, 2008 at 10:46:43PM +0300, Peter Dimov wrote:
Zeljko Vrba:
Even worse:
A: push; unlock; gets preempted B: wait_and_pop: succeeds, making the queue empty; unlocks the mutex A: gets scheduled again, notifies the condvar which has no waiters C: wait_and_pop: acquires mutex, sleeps on the condvar
No. C doesn't sleep because the wait is guarded by the predicate the_queue.empty().
But the predicate is true: B suceeded in popping the item from the stack, and made the stack empty [we assume that the stack was empty to begin with]. the_queue.empty() will return true after C has acquired mutex.