Spec-Zone.ru › D

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

Spec-Zone.ru

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