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 - カーネル状態変数

書式
<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_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)