CONDVAR(9)

名称
condvar, cv_init, cv_destroy, cv_wait, cv_wait_sig, cv_timedwait, cv_timedwait_sig, cv_signal, cv_broadcast, cv_waitq_remove, cv_waitq_empty, cv_wmesg - カーネル状態変数

書式
<sys/param.h> <sys/proc.h> <sys/condvar.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_waitq_remove(struct thread *td) int cv_waitq_empty(struct cv *cvp) 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_waitq_remove() は状態変数のウェイトキューからウェイトしているスレッドを取り除きます。 cv_waitq_empty() は cvp 上にウェイトしているものが存在しているかどうかを報告します。 cv_wmesg() は cv_init() への最初の呼び出しによって設定された cvp の説明文字列を返します。

スレッドは cv_wait(), cv_wait_sig(), cv_timedwait() または cv_timedwait_sig() の呼び出しの前に mp を保持しなければなしません。 スレッドがある状態でウェイトするときに、 mp はそのスレッドがブロックされる前に不可分に開放され、それから その関数呼び出しが戻る前に不可分に再獲得されます。 全てのウェイトするものは cvp と連携している同一の mp を渡さなければなりません。 スレッドは cv_signal() または cv_broadcast() を呼び出している間は、たとえ引数として渡していないとしても、 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_waitq_empty() は、ウェイトキュー上にスレッドが存在しない場合には は 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)