Boost logo

Boost Users :

From: Anteru (newsgroups_at_[hidden])
Date: 2008-04-19 06:48:10


Hi,

I've posted this to the users list as well, but it might have got lost
as I replied on the original thread.

Well, I still have problems with the conditions, even with the latest
SVN. The problem seems to be that inside a block like:

Lock lock (mutex);

while (something.empty ())
     cond.wait (mutex);

I'm still getting into a state where something.empty () == false and yet
I'm waiting on the condition. The only other access happens via:

Lock lock (mutex);

something.push (...);
cond.notify_one ();

So I don't get it how something can go wrong, unless the transition from
mutex.unlock () to cond.wait () is not fully atomic and the following
happens:

Thread 1:
while (something.empty ())
     cond.wait (mutex);
// starts, releaes lock but is not waiting yet

Now comes Thread 2:
Lock lock ();
something.push
cond.notify_one ();
// Nobody waiting
lock.release ();

Thread 1 again:
cond.wait (mutex); // starts waiting

I had a similar problem with my own condition implementation on Windows,
with exactly the same syndromes (I've been following the "Strategies for
Implementing POSIX Condition Variables on Win32"
http://www.cs.wustl.edu/~schmidt/win32-cv-1.html - only got it working
properly with SignalObjectAndWait).

Currently, it always leaves exactly *one* thread waiting, while
previously, it left several threads waiting, so it has improved but
there is still a problem.

Any ideas? Anything I can do to track this down further?

Cheers,
   Anteru


Boost-users list run by williamkempf at hotmail.com, kalb at libertysoft.com, bjorn.karlsson at readsoft.com, gregod at cs.rpi.edu, wekempf at cox.net