CONDVAR(9) FreeBSD カーネル開発者マニュアル CONDVAR(9)
名称
condvar, cv_init, cv_destroy, cv_wait, cv_wait_sig, cv_timedwait, cv_timedwait_sig, cv_signal, cv_broadcast, cv_broadcastpri, cv_wmesg − カーネル状態変数 |
書式
#include <sys/param.h> void |
cv_init(struct cv *cvp, const char *desc); void |
cv_destroy(struct cv *cvp); void |
cv_wait(struct cv *cvp, struct mtx *mp); int |
cv_wait_sig(struct cv *cvp, struct mtx *mp); int |
cv_timedwait(struct cv *cvp, struct mtx *mp, int timo); int |
cv_timedwait_sig(struct cv *cvp, struct mtx *mp, int timo); void |
cv_signal(struct cv *cvp); void |
cv_broadcast(struct cv *cvp); void |
cv_broadcastpri(struct cv *cvp, int pri); const char * |
cv_wmesg(struct cv *cvp); |
解説 |
状態変数は mutex と連携して状態の発生を待つために使用されます。状態変数は cv_init() を使用して作成されます。ここで cvp は struct cv のための領域へ のポインタ、 desc はその状態変数を説明するヌルで終端された文字列へのポイ ンタです。状態変数は cv_destroy() を使用して破壊されます。スレッドは cv_wait(), cv_wait_sig(), cv_timedwait() または cv_timedwait_sig() の呼び 出しによって、状態変数上でウェイトします。スレッドは、 1 つのウェイトのブ ロックを解除するためには cv_signal() の、または全てのウェイトのブロックを 解除するには cv_broadcast() または cv_broadcastpri() の呼び出しによって ウェイトのブロック解除を行います。ウェイタを起こすのに加えて、 cv_broadcastpri() は、高い優先度を持っていない全てのスレッドの優先度を上 げることによって、全てのウェイタが最低でも pri の優先度を持つことを保証し ます。 cv_wmesg() は cv_init() への最初の呼び出しによって設定された cvp の説明文字列を返します。 スレッドは cv_wait(), cv_wait_sig(), cv_timedwait() または cv_timedwait_sig() の呼び出しの前に mp を保持しなければなしません。スレッ ドがある状態でウェイトするときに、 mp はそのスレッドがブロックされる前に 不可分に開放され、それからその関数呼び出しが戻る前に不可分に再獲得されま す。全てのウェイトするものは cvp と連携している同一の mp を渡さなければな りません。スレッドは cv_signal(), cv_broadcast() または cv_broadcastpri() を呼び出している間は、たとえ引数として渡していないとしても、 mp を保持し なければなりません。 cv_wait(), cv_wait_sig(), cv_timedwait() および cv_timedwait_sig() のブ ロックが解除された時に、これらの呼び出しスレッドが実行可能にされます。 cv_timedwait() および cv_timedwait_sig() はブロックが解除され EWOULDBLOCK を返す前に最長 timo / HZ 秒間ウェイトします。そうでなければ、0 を返しま す。 cv_wait_sig() および cv_timedwait_sig() は、シグナルがとらえられた場 合には未完のまま EINTR または ERESTART の値で戻ります。または、 cv_signal() または cv_broadcast() で通知を受けた場合には 0 の値で戻りま す。 |
戻り値
成功の場合には、 cv_wait_sig(), cv_timedwait() および cv_timedwait_sig() は 0 を返します。そうでない場合には、0 ではないエラーコードが返されます。 cv_wmesg() は cv_init() に渡された説明文字列を返します。 |
エラー
cv_wait_sig() および cv_timedwait_sig() は以下の場合に失敗します。 |
[EINTR]
マスクされていないシグナルがつかまりました。 [ERESTART] cv_timedwait() および cv_timedwait_sig() は以下の場合に失敗します。 [EWOULDBLOCK] 関連項目 |
msleep(9), mtx_pool(9), mutex(9), sema(9), sx(9) FreeBSD 10.0 December 11, 2000 FreeBSD 10.0 |