状態変数は 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 の値で戻ります。