
Anteru
The documentation of Condition::notify_one says it unblocks one of the threads waiting currently on the condition -- what happens if I have several threads waiting and I call notify_one twice?
If there are multiple threads waiting, the first call to notify_one() should wake one, and the second call should wake another.
It seems that on Windows/x64/VC9, only on thread wakes up if notify_one is called twice in a row. Is this right?
That would be incorrect behaviour if there really is two threads waiting.
Second, wait says: "The thread will unblock when notified by a call to this->notify_one() or this->notify_all(), or spuriously". Is it likely that a condition unblocks spuriously? After all, I'd expect to unblock only after calling notify_* and not "by accident". Is there any way to get diagnostic output when a wait has been called spuriously?
It is not possible to detect a spurious wake: if it was, then the implementation would resume waiting. However, spurious wakes should be rare occurrences.
The problem I'm having at the moment is: I have PIMPLed Boost.Thread behind some simple wrappers, and I'm using them like this here:
Lock lock (mutex_);
if (queue.empty ()) { waitForItem.wait (lock); }
with Lock being a wrapper for scoped_lock, mutex being a wrapper for mutex and waitForItem being a condition, and funnily enough it goes waiting even though there is an item in queue (i.e., queue.empty () == false). I'm not sure where this is coming from (all access to queue is protected using mutexes), only candidate at the moment is that when inserting, I call notify_one, and if two items get inserted one right after the other, I assume that only one thread is woken up and hence the other remains waiting although there is an item in the queue.
Notifies are not sticky, so if there is no thread waiting when notify_one() is called, the notify is lost.
It works when I use notify_all (), but this does not smell right to me :/
Can you show me some code? Anthony -- Anthony Williams | Just Software Solutions Ltd Custom Software Development | http://www.justsoftwaresolutions.co.uk Registered in England, Company Number 5478976. Registered Office: 15 Carrallack Mews, St Just, Cornwall, TR19 7UL