nlib
nn::nlib::threading::CondVar クラスfinal

同期処理を行うための条件変数です。 [詳解]

#include "nn/nlib/threading/CondVar.h"

公開メンバ関数

constexpr CondVar () noexcept=default
 デフォルトコンストラクタです。
 
void Notify () noexcept
 ウェイトしているスレッドの1つ以上にシグナルします。 [詳解]
 
void NotifyAll () noexcept
 ウェイトしているスレッド全てにシグナルします。
 
template<class lock_type >
errno_t Wait (lock_type &lock) noexcept NLIB_REQUIRES(lock)
 ウェイトします。 [詳解]
 
template<class lock_type >
NLIB_CHECK_RESULT errno_t WaitFor (lock_type &lock, const nlib_ns::TimeSpan &timeout) noexcept NLIB_REQUIRES(lock)
 期間を指定したタイムアウトつきのウェイトをします。 [詳解]
 
template<class lock_type >
NLIB_CHECK_RESULT errno_t WaitUntil (lock_type &lock, const nlib_ns::DateTime &datetime) noexcept NLIB_REQUIRES(lock)
 日時を指定したタイムアウトつきのウェイトをします。 [詳解]
 

詳解

同期処理を行うための条件変数です。

説明
共有されている情報がある条件を満たした場合にスレッドを起床させたい場合に利用します。
条件を満たすまでWait()関数で待ち続け、Notify(), NotifyAll()で起床します。
pthread_condや、WindowsのCONDITION_VARIABLEと同様の機能です。
SimpleCriticalSection m;
CondVar cond;
bool flag;
if (!cond.Initialize()) { エラー; }
....
// 典型的な条件変数のウェイトループ
m.lock();
while (!flag) {
// どこか別のスレッドでcond.Notify(), cond.NotifyAll()されるのを待つ
// (その際flagも一緒にtrueにされる)
errno_t e = cond.Wait(m);
if (e != 0) { エラー; }
// スレッドが起きた場合でも必ずしもflagが立っている訳ではないことに注意
// この後flagの値を改めて確認しなければならない。
}
// 排他的な処理を行う
....
flag = false;
m.unlock();

CondVar.h33 行目に定義があります。

関数詳解

§ Notify()

nn::nlib::threading::CondVar::Notify ( )
inlinenoexcept

ウェイトしているスレッドの1つ以上にシグナルします。

説明
長い間シグナルを受け取れないスレッドが発生する可能性があるため、NotifyAll()の利用をお勧めします。

CondVar.h49 行目に定義があります。

§ Wait()

template<class lock_type >
nn::nlib::threading::CondVar::Wait ( lock_type &  lock)
inlinenoexcept

ウェイトします。

引数
[in,out]lockCriticalSection等のlock(), unlock()メンバ関数を持つクラスです。
戻り値
0エラーは発生していません
ENOMEMシステムリソースが足りない場合

CondVar.h63 行目に定義があります。

§ WaitFor()

template<class lock_type >
nn::nlib::threading::CondVar::WaitFor ( lock_type &  lock,
const nlib_ns::TimeSpan timeout 
)
inlinenoexcept

期間を指定したタイムアウトつきのウェイトをします。

引数
[in,out]lockCriticalSection等のlock(), unlock()メンバ関数を持つクラスです。
[in]timeoutタイムアウト時間です。
戻り値
0エラーは発生していません
ETIMEDOUTタイムアウトした場合
ENOMEMシステムリソースが足りない場合

CondVar.h71 行目に定義があります。

§ WaitUntil()

template<class lock_type >
nn::nlib::threading::CondVar::WaitUntil ( lock_type &  lock,
const nlib_ns::DateTime datetime 
)
inlinenoexcept

日時を指定したタイムアウトつきのウェイトをします。

引数
[in,out]lockCriticalSection等のlock(), unlock()メンバ関数を持つクラスです。
[in]datetimeタイムアウト期限です。
戻り値
0エラーは発生していません
ETIMEDOUTタイムアウトした場合
ENOMEMシステムリソースが足りない場合

CondVar.h76 行目に定義があります。


このクラス詳解は次のファイルから抽出されました: