英語版
このページの英語版を見る
core.sync.semaphore
semaphoreモジュールは同期用の汎用セマフォを提供する。
License:
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
(Durationperiod
); - 現在のカウントがゼロより上に移動するまで、あるいは 指定された時間が経過するまで、呼び出し元のスレッドを一時停止する。 カウントがゼロより上に移動した場合 この間にカウントがゼロより上に移動した場合は、カウントをアトミックに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
; - システム固有セマフォへのハンドル。
Copyright © 1999-2024 by the D Language Foundation
DEEPL APIにより翻訳、ところどころ修正。
このページの最新版(英語)
このページの原文(英語)
翻訳時のdmdのバージョン: 2.108.0
ドキュメントのdmdのバージョン: 2.109.1
翻訳日付 :
HTML生成日時:
編集者: dokutoku