pthread_cond_wait または pthread_cond_timedwait サブルーチン

目的

呼び出しスレッドを条件にブロックします。

ライブラリー

スレッド・ライブラリー (libpthreads.a)

構文

#include <pthread.h>

int pthread_cond_wait (cond, mutex)
pthread_cond_t *cond;
pthread_mutex_t *mutex;

int pthread_cond_timedwait (cond, mutex, timeout)
pthread_cond_t *cond;
pthread_mutex_t *mutex;
const struct timespec *timeout;

説明

pthread_cond_wait および pthread_cond_timedwait 関数は、条件変数をブロックするために使用されます。 これらは、呼び出しスレッドによってロックされた mutex を使用して呼び出されるか、または未定義の動作になります。

これらの関数は、 mutex をアトミックに解放し、呼び出しスレッドに条件変数 condでブロックさせます。ここでアトミックとは、別のスレッドによる mutex へのアクセスと条件変数へのアクセスをアトミックに意味します。 つまり、about-to-block スレッドが mutex を解放した後で別のスレッドが mutex を獲得できる場合、そのスレッド内の pthread_cond_signal または pthread_cond_broadcast に対する後続の呼び出しは、about-to-block スレッドがブロックされた後に発行されたかのように動作します。

正常に戻ると、mutex はロックされ、呼び出しスレッドによって所有されます。

条件変数を使用する場合、各条件待機に関連付けられた共有変数を含むブール述部が常に存在します。これは、スレッドを続行する必要がある場合に true になります。 pthread_cond_wait または pthread_cond_timedwait 関数からの誤ったウェイクアップが発生する可能性があります。 pthread_cond_wait または pthread_cond_timedwait からの戻りは、この述部の値については何も意味しないため、そのような戻り時に述部を再評価する必要があります。

同じ条件変数に対して複数の mutex を並行 pthread_cond_wait または pthread_cond_timedwait 操作に使用する効果は未定義です。つまり、スレッドが条件変数を待機するときに条件変数が固有の mutex にバインドされ、待機が戻るときにこの (動的) バインディングが終了します。

条件待ち (時限かどうかにかかわらず) は、取り消しポイントです。 スレッドの取り消し可能性の使用可能状態が PTHREAD_CANCEL_DEFERRED に設定されている場合、条件待機中に取り消し要求を処理する副次作用は、最初の取り消しクリーンアップ・ハンドラーを呼び出す前に mutex が (実際に) 再獲得されることです。 この結果は、スレッドが非ブロック化され、 pthread_cond_wait または pthread_cond_timedwaitの呼び出しから戻る時点まで実行できるようになりますが、その時点で取り消し要求に気付き、 pthread_cond_wait または pthread_cond_cleanup 取り消しアクティビティーの呼び出し元に戻る代わりに、呼び出し元に戻ることになります。

pthread_cond_wait または pthread_cond_timedwait の呼び出しでブロックされている間に取り消されたために非ブロック化されたスレッドは、条件変数で他のスレッドがブロックされている場合、条件変数で同時に送信される可能性のある条件シグナルをコンシュームしません。

pthread_cond_timedwait 関数は pthread_cond_wait と同じです。ただし、条件 cond がシグナル通知またはブロードキャストされる前に timeout で指定された絶対時間 (つまり、システム時間が timeout以上) が経過した場合、または timeout で指定された絶対時間が既に渡された場合には、エラーが戻されます。 このようなタイムアウトが発生すると、 pthread_cond_timedwait は mutex を解放し、 mutexによって参照される mutex を再獲得します。 関数 pthread_cond_timedwait も、取り消しポイントです。 timeout によって指定される絶対時間は、システム・リアルタイム・クロックまたはシステム・単調クロックのいずれかに基づきます。 条件変数の参照クロックは、対応する条件属性オブジェクトを使用して初期化の前に pthread_condattr_setclock を呼び出すことによって設定されます。

シグナルがスレッドに送信され、条件変数を待機している場合、シグナル・ハンドラーから戻ると、スレッドは、中断されなかったかのように条件変数の待機を再開するか、または疑似ウェイクアップのためにゼロを戻します。

パラメーター

項目 説明
条件 待機する条件変数を指定します。
mutex 条件変数を保護するために使用される mutex を指定します。 サブルーチンの呼び出し時には、mutex がロックされていなければなりません。
timeout ブロック状態タイムアウトを指定する絶対時間構造体を指します。

戻り値

ETIMEDOUT の場合を除き、これらのエラー・チェックはすべて、関数の処理の開始時に即時に実行されたかのように動作し、mutex によって指定された mutex の状態または condによって指定された条件変数を変更する前に、事実上エラーを戻します。

正常終了すると、値ゼロが戻されます。 正常に実行されなかった場合、エラーを示すエラー番号を戻します。

エラー・コード

pthread_cond_timedwait 関数は、以下の場合に失敗します。

項目 説明
ETIMEDOUT timeout によって pthread_cond_timedwait に指定された時間が経過した。

pthread_cond_wait および pthread_cond_timedwait サブルーチンは、以下のエラー・コードが戻されると失敗します。

項目 説明
EINVAL condmutex、または timeout によって指定された値が無効です。
EINVAL 同じ条件変数に対する並行 pthread_cond_wait または pthread_cond_timedwait 操作に対して、異なる mutex が提供されました。
EINVAL mutex は呼び出された時に現行スレッドによって所有されていません。
EPERM 呼び出し時に mutex が現行スレッドによって所有されておらず、XPG_SUS_ENV が ON に設定され、 XPG_UNIX98 が設定されていません。
ENOTRECOVERABLE mutex の保護状態はリカバリーできません。
eownerdead (所有者不要) mutex は堅固な mutex であり、mutex ロックを保持している間に、mutex を所有するスレッドのプロセスが終了しました。

これらのサブルーチンは、 EINTR エラー・コードを戻しません。