core.sync.semaphore
Модуль semaphore предоставляет семафор общего использования для синхронизации.
- Лицензия:
- Boost License 1.0
- Авторы:
- Sean Kelly
- Исходный код
- core/sync/semaphore.d
- class Semaphore;
-
Этот класс представляет собой семафор общего подсчета, как задумывал Эдсгер Дейкстра. Однако, в соответствии с моделями мониторов Mesa, «signal» заменён на «notify», чтобы указать, что управление не передаётся ожидающему потоку при отправке уведомления.
- Примеры:
-
import core.thread, core.atomic; void testWait() { auto semaphore = new Semaphore; shared bool stopConsumption = false; immutable numToProduce = 20; immutable numConsumers = 10; shared size_t numConsumed; shared size_t numComplete; void consumer() { while (true) { semaphore.wait(); if (atomicLoad(stopConsumption)) break; atomicOp!"+="(numConsumed, 1); } atomicOp!"+="(numComplete, 1); } void producer() { assert(!semaphore.tryWait()); foreach (_; 0 .. numToProduce) semaphore.notify(); // wait until all items are consumed while (atomicLoad(numConsumed) != numToProduce) Thread.yield(); // mark consumption as finished atomicStore(stopConsumption, true); // wake all consumers foreach (_; 0 .. numConsumers) semaphore.notify(); // wait until all consumers completed while (atomicLoad(numComplete) != numConsumers) Thread.yield(); assert(!semaphore.tryWait()); semaphore.notify(); assert(semaphore.tryWait()); assert(!semaphore.tryWait()); } auto group = new ThreadGroup; for ( int i = 0; i < numConsumers; ++i ) group.create(&consumer); group.create(&producer); group.joinAll(); } void testWaitTimeout() { auto sem = new Semaphore; shared bool semReady; bool alertedOne, alertedTwo; void waiter() { while (!atomicLoad(semReady)) Thread.yield(); alertedOne = sem.wait(dur!"msecs"(1)); alertedTwo = sem.wait(dur!"msecs"(1)); assert(alertedOne && !alertedTwo); } auto thread = new Thread(&waiter); thread.start(); sem.notify(); atomicStore(semReady, true); thread.join(); assert(alertedOne && !alertedTwo); } testWait(); testWaitTimeout();
- this(uint count = 0);
-
Инициализирует объект семафора с указанным начальным значением.
- Параметры:
uint countНачальное значение семафора.
- Исключения:
- SyncError при ошибке.
- void wait();
-
Ожидает, пока текущее значение не станет больше нуля, затем атомарно уменьшает значение на единицу и возвращается.
- Исключения:
- SyncError при ошибке.
- bool wait(Duration period);
-
Приостанавливает вызывающий поток, пока текущее значение не станет больше нуля или пока не истечёт заданный интервал времени. Если значение станет больше нуля в течение этого интервала, то атомарно уменьшает значение на единицу и возвращает true. В противном случае возвращает false.
- Параметры:
Duration periodВремя ожидания.
- Входные данные
- period должно быть неотрицательным.
- Исключения:
- SyncError при ошибке.
- Возвращаемое значение:
- true, если уведомление произошло до истечения таймаута, и false — в противном случае.
- void notify();
-
Атомарно увеличивает текущее значение на единицу. Это уведомит один ожидающий поток, если таковые есть в очереди.
- Исключения:
- SyncError при ошибке.
- bool tryWait();
-
Если текущее значение равно нулю, возвращает значение. В противном случае атомарно уменьшает значение на единицу и возвращает true.
- Исключения:
- SyncError при ошибке.
- Возвращаемое значение:
- true, если значение было больше нуля, и false — в противном случае.
- protected alias Handle = core.sys.posix.semaphore.sem_t;
-
Использует тип семафора, специфичный для операционной системы.
- protected Handle m_hndl;
-
Дескриптор семафора, специфичного для системы.
© 1999–2021 The D Language Foundation
Licensed under the Boost License 1.0.
https://dlang.org/phobos/core_sync_semaphore.html