Spec-Zone.ru › D

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

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API