英語版
このページの英語版を見る

core.sync.semaphore

semaphoreモジュールは同期用の汎用セマフォを提供する。
Authors:
Sean Kelly
class Semaphore;
このクラスは、Edsger Dijkstraによって考えられた一般的な計数セマフォを表している。 しかし、"Mesa型モニター"のように、"signal"は"notify"に置き換えられている。 notify "に置き換えられている。 に制御が移らないことを示す。
Examples:
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();

        // すべてのアイテムが消費されるまで待つ
        while (atomicLoad(numConsumed) != numToProduce)
            Thread.yield();

        // consumptionを完了としてマークする
        atomicStore(stopConsumption, true);

        // すべてのconsumerを起こす
        foreach (_; 0 .. numConsumers)
            semaphore.notify();

        // すべてのconsumerが完了するまで待つ
        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);
指定された初期カウントでセマフォ・オブジェクトを初期化する。
Parameters:
uint count セマフォの初期カウント。
Throws:
エラー時にSyncError。
void wait();
現在のカウントが0以上になるまで待ち、それからアトミックにカウントを1つデクリメントして返す。 カウントを1つデクリメントしてリターンする。
Throws:
エラー時に SyncError。
bool wait(Duration period);
現在のカウントがゼロより上に移動するまで、あるいは 指定された時間が経過するまで、呼び出し元のスレッドを一時停止する。 カウントがゼロより上に移動した場合 この間にカウントがゼロより上に移動した場合は、カウントをアトミックに1つデクリメントして を返す。 そうでない場合はfalseを返す。
Parameters:
Duration period 待機時間。

において 期間は負であってはならない。

Throws:
エラー時に SyncError を返す。
Returns:
タイムアウト前に通知された場合はtrue、通知されなかった場合はfalseを返す。
void notify();
アトミックに現在のカウントを1つ増やす。 これは ウェイターに通知する。
Throws:
エラー時に SyncError を返す。
bool tryWait();
現在のカウントが0に等しい場合、戻る。 そうでなければ、アトミックに カウントを1つデクリメントしてtrueを返す。
Throws:
エラー時に SyncError を返す。
Returns:
カウントがゼロ以上であれば真、そうでなければ偽。
protected alias Handle = core.sys.posix.semaphore.sem_t;
オペレーティング・システム固有のセマフォ型のエイリアス。
protected Handle m_hndl;
システム固有セマフォへのハンドル。