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

core.sync.condition

conditionモジュールは、"synchronized"条件チェックのためのプリミティブを提供する。 を提供する。
Authors:
Sean Kelly
class Condition;
このクラスは、C.A.R. Hoareによって考案された条件変数を表す。 しかし しかし、"signal"は"notify"に置き換えられている。 に置き換えられている。 に置き換えられている。
Examples:
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;
            // 通知は絶対に見逃さない(30秒)
            alertedOne = condReady.wait( dur!"seconds"(30) );
            // しかしタイムアウトまで長くは待ちたくない(10ミリ秒)
            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 @nogc @safe this(Mutex m);

shared nothrow @nogc @safe this(shared Mutex m);
与えられた 条件オブジェクトを初期化する。
Parameters:
Mutex m この条件が関連付けられるミューテックス。
Throws:
エラー時に SyncError を返す。
@property Mutex mutex();

shared @property shared(Mutex) mutex();
この条件に関連付けられたミューテックスを取得する。
Returns:
この条件に関連付けられているミューテックスを取得する。
void wait();

shared void wait();

void wait(this Q)(bool _unused_)
if (is(Q == Condition) || is(Q == shared(Condition)));
通知されるまで待つ。
Throws:
エラー時に SyncError。
bool wait(Duration val);

shared bool wait(Duration val);

bool wait(this Q)(Duration val, bool _unused_)
if (is(Q == Condition) || is(Q == shared(Condition)));
通知が発生するまで、または指定された 指定された時間が経過するまで
Parameters:
Duration val 待機する時間。

で指定する。 値は負であってはならない。

Throws:
エラー時に SyncError が発生する。
Returns:
タイムアウト前に通知された場合はtrue、通知されなかった場合はfalseを返す。
void notify();

shared void notify();

void notify(this Q)(bool _unused_)
if (is(Q == Condition) || is(Q == shared(Condition)));
1人のウェイターに通知する。
Throws:
エラー時に SyncError を通知する。
void notifyAll();

shared void notifyAll();

void notifyAll(this Q)(bool _unused_)
if (is(Q == Condition) || is(Q == shared(Condition)));
すべてのウェイターに通知する。
Throws:
エラー時に SyncError。