On Monday, 13 May 2013 at 20:44:37 UTC, Heinz wrote:
Ok, here's a summary in case someone else is in the same need:

1) Want to know what "mutex/condition" are, how do they work and when to use them? Here's a good resource: http://stackoverflow.com/a/4742236

2) If you come to the question "Why a condition needs a mutex?": http://stackoverflow.com/questions/2763714/why-do-pthreads-condition-variable-functions-require-a-mutex

3) Need a working example in D? (by Steven Schveighoffer): http://forum.dlang.org/thread/j7sdte$25qm$1...@digitalmars.com


Here is the absolute minimum of code I could think to try Condition. I tested it on linux 64bits and windows 32bits. There is one thing that should definitely added to the documentation, and that is what happens when one issues a notify while the thread hasn't yet called Condition.wait().

I seem to recall (though I might be wrong) that win32 events can be signalled before the thread calls WaitForSingleObject (or WaitForMultipleObjects), and if it was signalled, the call returns immediately. I think this was very useful.


import std.stdio, core.thread, core.sync.condition, core.sync.mutex;

//Note: The condition must be __gshared:
__gshared Condition condition;
__gshared Mutex mutex;

private void myThread() {
    writeln("Started");
    synchronized(mutex) {
        condition.wait();
    }
    writeln("Notified");
}

void main() {
    mutex = new Mutex();
    condition = new Condition(mutex);

    Thread theThread = new Thread(&myThread);
    theThread.start();

    //Note: if one doesn't wait for the thread to
    //get to condition.wait(), before calling notify(),
    //the thread is not awaken. (ie: commenting the
    //sleep makes the thread stuck).
    Thread.sleep(dur!"msecs"(100));
    synchronized(mutex) {
        condition.notify();
    }

    theThread.join();
    writeln("main finished");
}


Reply via email to