Sourcecore/sync/condition.d
Condition;import core.sync.mutex;import core.sync.semaphore;import core.thread;void testNotify(){auto mutex =new Mutex;auto condReady =newCondition( mutex );auto semDone =new Semaphore;auto synLoop =new Object;int numWaiters = 10;int numTries = 10;int numReady = 0;int numTotal = 0;int numDone = 0;int numPost = 0;void waiter() {for (int i = 0; i < numTries; ++i ) {synchronized( mutex ) {while ( numReady < 1 ) { condReady.wait(); } --numReady; ++numTotal; }synchronized( synLoop ) { ++numDone; } semDone.wait(); } }auto group =new ThreadGroup;for (int i = 0; i < numWaiters; ++i ) group.create( &waiter );for (int i = 0; i < numTries; ++i ) {for (int j = 0; j < numWaiters; ++j ) {synchronized( mutex ) { ++numReady; condReady.notify(); } }while (true ) {synchronized( synLoop ) {if ( numDone >= numWaiters )break; } Thread.yield(); }for (int j = 0; j < numWaiters; ++j ) { semDone.notify(); } } group.joinAll();assert( numTotal == numWaiters * numTries );}void testNotifyAll(){auto mutex =new Mutex;auto condReady =newCondition( mutex );int numWaiters = 10;int numReady = 0;int numDone = 0;bool alert =false;void waiter() {synchronized( mutex ) { ++numReady;while ( !alert ) condReady.wait(); ++numDone; } }auto group =new ThreadGroup;for (int i = 0; i < numWaiters; ++i ) group.create( &waiter );while (true ) {synchronized( mutex ) {if ( numReady >= numWaiters ) { alert =true; condReady.notifyAll();break; } } Thread.yield(); } group.joinAll();assert( numReady == numWaiters && numDone == numWaiters );}void testWaitTimeout(){auto mutex =new Mutex;auto condReady =newCondition( mutex );bool waiting =false;bool alertedOne =true;bool alertedTwo =true;void waiter() {synchronized( mutex ) { waiting =true;// we never want to miss the notification (30s) alertedOne = condReady.wait( dur!"seconds"(30) );// but we don't want to wait long for the timeout (10ms) alertedTwo = condReady.wait( dur!"msecs"(10) ); } }auto thread =new Thread( &waiter ); thread.start();while (true ) {synchronized( mutex ) {if ( waiting ) { condReady.notify();break; } } Thread.yield(); } thread.join();assert( waiting );assert( alertedOne );assert( !alertedTwo );}testNotify();testNotifyAll();testWaitTimeout();
m);m) shared;Mutexm | The mutex with which this condition will be associated. |
mutex();mutex() shared;wait();wait() shared;wait(this Q)(bool_unused_)wait(Durationval);wait(Durationval) shared;wait(this Q)(Durationval, bool_unused_)Durationval | The time to wait. |
Inval must be non-negative.
notify();notify() shared;notify(this Q)(bool_unused_)notifyAll();notifyAll() shared;notifyAll(this Q)(bool_unused_)