core.sync.condition
Модуль condition предоставляет примитив для синхронизированной проверки условия.
- Лицензия:
- Boost License 1.0
- Авторы:
- Sean Kelly
- Источник
- core/sync/condition.d
- class Condition;
-
Этот класс представляет собой переменную условия в понимании C.A.R. Хоара. Однако, в соответствии с типами мониторов Mesa, «signal» заменено на «notify», чтобы указать, что управление не передается ожидающему потоку при отправке уведомления.
- Примеры:
-
import core.thread; import core.sync.mutex; import core.sync.semaphore; void testNotify() { auto mutex = new Mutex; auto condReady = new Condition( 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 = new Condition( 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 = new Condition( 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();
- nothrow @safe this(Mutex m);
shared nothrow @safe this(shared Mutex m); -
Инициализирует объект условия, связанный с предоставленным объектом мьютекса.
- Параметры:
Mutex mМьютекс, с которым будет связан это условие.
- Исключения:
- SyncError при ошибке.
- @property Mutex mutex();
shared @property shared(Mutex) mutex(); -
Получает мьютекс, связанный с этим условием.
- Возвращает:
- Мьютекс, связанный с этим условием.
- void wait();
shared void wait();
void wait(this Q)(bool _unused_)
Constraints: if (is(Q == Condition) || is(Q == shared(Condition))); -
Ожидать уведомления.
- Исключения:
- SyncError при ошибке.
- bool wait(Duration val);
shared bool wait(Duration val);
bool wait(this Q)(Duration val, bool _unused_)
Constraints: if (is(Q == Condition) || is(Q == shared(Condition))); -
Приостанавливает вызывающий поток до тех пор, пока не произойдет уведомление или пока не истечет предоставленный интервал времени.
- Параметры:
Duration valВремя ожидания.
- Входные данные
- val должен быть неотрицательным.
- Исключения:
- SyncError при ошибке.
- Возвращает:
- true, если произошло уведомление до истечения срока ожидания, и false в противном случае.
- void notify();
shared void notify();
void notify(this Q)(bool _unused_)
Constraints: if (is(Q == Condition) || is(Q == shared(Condition))); -
Уведомляет одного ожидающего потока.
- Исключения:
- SyncError при ошибке.
- void notifyAll();
shared void notifyAll();
void notifyAll(this Q)(bool _unused_)
Constraints: if (is(Q == Condition) || is(Q == shared(Condition))); -
Уведомляет всех ожидающих потоков.
- Исключения:
- SyncError при ошибке.
© 1999–2021 The D Language Foundation
Licensed under the Boost License 1.0.
https://dlang.org/phobos/core_sync_condition.html