
項目 39:イベントが 1 度切りならば void な future を検討する
|
275
項目 39:イベントが 1 度切りならば void な future を検討する
ある特定のイベントが発生した場合に、タスクに第 2 のタスクを非同期に実行させると有用な
場面もあります。イベントが発生するまで第 2 のタスクは処理を開始できない場合です。例えば、
データの初期化が完了した、計算の準備が整った、センサが異常な値を検知したなどが考えられま
す。このような場面でのスレッド間通信の最適な方法とは何でしょうか?
分かりやすい方法は条件変数(condition variable、condvar)でしょう。条件を検知するタスク
を検知タスク(detecting task)、条件に反応し処理を開始するタスクを反応タスク(reacting task)
とそれぞれ呼ぶとします。方式は単純です。反応タスクは条件変数でウェイトし、検知タスクはイ
ベント発生を条件変数に通知します。
std::condition_variable cv; // condvar for event
イベント用の条件変数
std::mutex m; // mutex for use with cv
cv に使用する mutex
上例を用いた検知タスクのコードはこの上ないほど簡単なものです。
… // detect event
イベントを検知
cv.notify_one(); // tell reacting task
反応タスクへ通知
反応タスクが複数存在する場 ...