スポンサーリンク

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>
#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)

FreeBSD 10.0 December 11, 2000 FreeBSD 10.0

スポンサーリンク