マルチスレッドのプログラミング

pthread に相当するものがある同期関数 — 条件変数

条件変数の初期化

cv が指す条件変数を初期化するには、cond_init(3C) を使用します。

cond_init の構文

#include <thread.h>

int cond_init(cond_t *cv, int type, int arg);

type は、次のいずれかになります。

0 に初期化されたメモリーに領域を確保することによって、条件変数を初期化することもできます。その場合は、type に USYNC_THREAD を指定したものと仮定されます。

複数のスレッドから、同じ条件変数を同時に初期化してはいけません。一度初期化した条件変数はほかのスレッドが使用している可能性があるので、再初期化してはいけません。

POSIX スレッドの場合については、pthread_condattr_init の構文」を参照してください。

プロセス内スコープでの条件変数

#include <thread.h>

cond_t cv;
int ret;

/* to be used within this process only */
ret = cond_init(cv, USYNC_THREAD, 0); 

プロセス間スコープでの条件変数

#include <thread.h>

cond_t cv;
int ret;

/* to be used among all processes */
ret = cond_init(&cv, USYNC_PROCESS, 0); 

cond_init の戻り値

cond_init() は、正常終了時に 0 を返します。次のいずれかの条件が検出された場合、cond_init() は失敗し、対応する値を返します。


EFAULT

説明:

cv が指すアドレスが正しくありません。


EINVAL

説明:

type を認識できません。

条件変数の削除

cv が指す条件変数に関連付けられた状態を削除するには、cond_destroy(3C) を使用します。条件変数を格納する領域は解放されません。POSIX スレッドの場合については、pthread_condattr_destroy の構文」を参照してください。

cond_destroy の構文

#include <thread.h>

int cond_destroy(cond_t *cv);

cond_destroy の戻り値

cond_destroy() は、正常終了時に 0 を返します。次のいずれかの条件が検出された場合、cond_destroy() は失敗し、対応する値を返します。


EFAULT

説明:

cv が指すアドレスが正しくありません。


EBUSY

説明:

アクティブな条件変数の削除を試行していることが検出されました。

条件変数によるブロック

mp が指す mutex を不可分的に解放することにより、cv が指す条件変数上で呼び出しスレッドをブロックするには、cond_wait(3C) を使用します。ブロックされたスレッドを呼び起こすには、cond_signal()cond_broadcast() を使います。また、スレッドはシグナルや fork() の割り込みによっても呼び起こすことができます。

cond_wait() が戻るときは、たとえエラーを戻したときでも、常に mutex は呼び出しスレッドがロックし保持している状態にあります。

cond_wait の構文

#include <thread.h>

int cond_wait(cond_t *cv, mutex_t *mp);

cond_wait の戻り値

cond_wait() は、正常終了時に 0 を返します。次のいずれかの条件が検出された場合、cond_wait() は失敗し、対応する値を返します。


EFAULT

説明:

cv が指すアドレスが正しくありません。


EINTR

説明:

シグナルにより、待機中に割り込みが発生しました。

条件変数による指定時刻付きブロック

cond_timedwait(3C) は、cond_wait() と非常によく似ています。ただし、cond_timedwait() は、abstime で指定された時刻を過ぎるとブロック状態を解除します。POSIX スレッドの場合については、pthread_cond_timedwait の構文」を参照してください。

cond_timedwait の構文

#include <thread.h>

int cond_timedwait(cond_t *cv, mutex_t *mp, timestruct_t abstime);

cond_timedwait() が戻るときは、たとえエラーを戻したときでも、常に mutex は呼び出しスレッドがロックし保持している状態にあります。

cond_timedwait() のブロック状態が解除されるのは、条件変数にシグナルが送られたときか、最後の引数で指定した時刻を過ぎたときです。時間切れの指定は時刻で行うため、時間切れの時刻を再計算する必要がないので、効率的に条件を再評価できます。

cond_timedwait の戻り値

cond_timedwait() は、正常終了時に 0 を返します。次のいずれかの条件が検出された場合、cond_timedwait() は失敗し、対応する値を返します。


EFAULT

説明:

cv が指すアドレスが正しくありません。


ETIME

説明:

abstime で指定された時刻を過ぎています。


EINVAL

説明:

abstime が無効です。

時間間隔によるブロック

cond_reltimedwait(3C) は、3 番目の引数の値を除いて、cond_timedwait() と非常によく似ています。cond_reltimedwait() の 3 番目の引数には、絶対的な時刻ではなく、相対的な時間間隔値を指定します。POSIX スレッドの場合については、pthread_cond_reltimedwait_np(3C) のマニュアルページを参照してください。

cond_reltimedwait() が戻るときは、たとえエラーを戻したときでも、常に mutex は呼び出しスレッドがロックし保持している状態にあります。cond_reltimedwait() のブロック状態が解除されるのは、条件変数にシグナルが送られたときか、最後の引数で指定した時間間隔が経過したときです。

cond_reltimedwait の構文

#include <thread.h>

int cond_reltimedwait(cond_t *cv, mutex_t *mp,
    timestruct_t reltime);

cond_reltimedwait の戻り値

cond_reltimedwait() は、正常終了時に 0 を返します。次のいずれかの条件が検出された場合、cond_reltimedwait () は失敗し、対応する値を返します。


EFAULT

説明:

cv が指すアドレスが正しくありません。


ETIME

説明:

reltime で指定された時間を過ぎています。

特定のスレッドのブロック解除

cv が指す条件変数でブロックされている 1 つのスレッドのブロックを解除するには、cond_signal(3C) を使用します。スレッドがブロックされていない条件変数に対して cond_signal() を実行しても無視されます。

cond_signal の構文

#include <thread.h>

int cond_signal(cond_t *cv);

cond_signal の戻り値

cond_signal() は、正常終了時に 0 を返します。次の条件が検出された場合、cond_signal() は失敗し、対応する値を返します。


EFAULT

説明:

cv が指すアドレスが正しくありません。

全スレッドのブロック解除

cv が指す条件変数でブロックされているすべてのスレッドのブロックを解除するには、cond_broadcast(3C) を使用します。スレッドがブロックされていない条件変数に対して cond_broadcast() を実行しても無視されます。

cond_broadcast の構文

#include <thread.h>

int cond_broadcast(cond_t *cv);

cond_broadcast の戻り値

cond_broadcast() は、正常終了時に 0 を返します。次の条件が検出された場合、cond_broadcast() は失敗し、対応する値を返します。


EFAULT

説明:

cv が指すアドレスが正しくありません。