tail head cat sleep
QR code linking to this page

manページ  — CONDVAR

名称

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>
#include <sys/proc.h>
#include <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() を使用して作成されます。 ここで cvpstruct 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)

CONDVAR (9) December 11, 2000

tail head cat sleep
QR code linking to this page


このマニュアルページサービスについてのご意見は Ben Bullock にお知らせください。 Privacy policy.

UNIX has been evolving feverishly for close to 30 years, sort of like bacteria in a cesspool — only not as attractive
— John Levine, "Unix for Dummies"