英語版
このページの英語版を見る
core.sync.condition
conditionモジュールは、"synchronized"条件チェックのためのプリミティブを提供する。
を提供する。
License:
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 Mutexm
); - 与えられた 条件オブジェクトを初期化する。Parameters:
Mutex m
この条件が関連付けられるミューテックス。 Throws:エラー時に SyncError を返す。 - @property Mutex
mutex
();
shared @property shared(Mutex)mutex
(); - この条件に関連付けられたミューテックスを取得する。Returns:この条件に関連付けられているミューテックスを取得する。
- void
wait
();
shared voidwait
();
voidwait
(this Q)(bool_unused_
)
if (is(Q == Condition) || is(Q == shared(Condition))); - 通知されるまで待つ。Throws:エラー時に SyncError。
- bool
wait
(Durationval
);
shared boolwait
(Durationval
);
boolwait
(this Q)(Durationval
, bool_unused_
)
if (is(Q == Condition) || is(Q == shared(Condition))); - 通知が発生するまで、または指定された 指定された時間が経過するまでParameters:
Duration val
待機する時間。 で指定する。 値は負であってはならない。
Throws:エラー時に SyncError が発生する。Returns:タイムアウト前に通知された場合はtrue、通知されなかった場合はfalseを返す。 - void
notify
();
shared voidnotify
();
voidnotify
(this Q)(bool_unused_
)
if (is(Q == Condition) || is(Q == shared(Condition))); - 1人のウェイターに通知する。Throws:エラー時に SyncError を通知する。
- void
notifyAll
();
shared voidnotifyAll
();
voidnotifyAll
(this Q)(bool_unused_
)
if (is(Q == Condition) || is(Q == shared(Condition))); - すべてのウェイターに通知する。Throws:エラー時に SyncError。
Copyright © 1999-2024 by the D Language Foundation
DEEPL APIにより翻訳、ところどころ修正。
このページの最新版(英語)
このページの原文(英語)
翻訳時のdmdのバージョン: 2.108.0
ドキュメントのdmdのバージョン: 2.109.1
翻訳日付 :
HTML生成日時:
編集者: dokutoku