| 日本−日本語 |
|
|
|
![]() |
HP-UX リファレンス: セクション 3 : ライブラリ (N~Z) > ppthread_cond_wait(3T)pthread ライブラリHP-UX 11i Version 2: September 2004 |
|
名称pthread_cond_wait(), pthread_cond_timedwait() ― 条件変数に対する待機または一定時間待機 構文#include <pthread.h> パラメータ
説明pthread_cond_wait() 関数は、条件変数 cond に関連付けした条件の成立を待つために使用されます。 pthread_cond_timedwait() 関数は、条件変数 cond に関連付けした条件の成立を、時間制限をつけて待つために使用されます。 abstime パラメータは、この関数が時間切れになる時間を指定します。 abstime パラメータで指定された絶対時間を過ぎても、提示した条件がシグナル状態にならなかった場合、関数は呼び出し元にエラーを返します。 注意: abstime は待機が期限切れになる時間であり、スレッドが待機する時間の長さではありません。 cond によって表される条件変数は、 pthread_cond_init() の呼び出しで動的に初期化されるか、マクロ PTHREAD_COND_INITIALIZER で静的に初期化されていなければなりません。 どちらの関数も、呼び出しスレッドによってロックされた mutex を用いて呼び出される必要があります。 mutex が呼び出しスレッドによってロックされていないと、不測の動作が生じます。 これらの関数は、 mutex をアトミックに解放し、条件変数 cond によって呼び出しスレッドをブロックさせます。 ブロックしようとしているスレッドが mutex を解放した後 (ただし実際のブロックはまだ行われない)、別のスレッドが mutex を取得することが可能な場合、それ以後に他のスレッドによって pthread_cond_signal() または pthread_cond_broadcast() の呼び出しが行われると、ブロックしようとしているスレッドがブロックされた後で呼び出しが行われたのと同様の動作になります。 条件にシグナルが送られるか、時間待機が満了すると、呼び出し元のブロックは解除され、戻る前に mutex を再度取得します。 これらの関数は、呼び出しの成否にかかわらず、呼び出し元へ戻る前に必ず mutex が再度取得されます。 同じ条件変数でこれらの関数を同時に呼び出しすために異なる mutex を使用すると、動作は不定になります。 条件変数を使用するときは、各条件待機に関連付けられた論理型の述語を用意します。 この述語が偽の場合、スレッドは条件待機する必要があります。 条件変数で待機しているときには、疑似再開が発生する可能性もあります。 疑似再開は、スレッドが本当は待機を続けなければならないのに、条件待機から戻ってしまうときに発生します。 条件待機しているスレッドへ配信される通常のシグナルは、疑似再開を発生させることがあります。 pthread_cond_wait() と pthread_cond_timedwait() からの戻り値は、この述語の値を何も示さないので、必ず述語を再評価する必要があります。 条件待機は、1 つの キャンセルポイント となります。呼び出しスレッドの遅延取り消しが可能な場合、 取り消し要求がキャンセルポイントで実行されます。 これらの関数の 1 つでスレッドがブロックされている間に取り消し要求が作動した場合、 mutex が再度取得され、それから取り消しクリーンアップハンドラーが呼び出されます。 取り消しクリーンアップハンドラーは、アプリケーションでデッドロックを発生させないように mutex を解放する必要があります。 条件シグナルと取り消し要求が両方とも発生する場合、取り消されたスレッドは条件シグナルを消費しません (条件シグナルでは別のスレッドがブロック解除されます)。 条件変数を待つスレッドにシグナルが配送される場合、シグナルハンドラーから戻るとスレッドは、疑似再開のために 0 を返すか、継続して条件を待つ可能性があります。 戻り値正常終了すると、 pthread_cond_wait() と pthread_cond_timedwait() は 0 を返します。 それ以外の場合、エラーの内容を表すエラー番号を返します (errno 変数は使用しません)。 エラー以下の条件の場合、 pthread_cond_timedwait() 関数は、該当するエラー番号を返します。
以下の条件の場合、 pthread_cond_wait() と pthread_cond_timedwait() 関数は、該当するエラー番号を返します。
警告pthread_cond_wait() または pthread_cond_timedwait() がエラーなしで戻ったときでも、関連付けられた述語が偽である可能性に注意することが重要です。 pthread_cond_timedwait() がタイムアウトエラーで戻るとき、関連付けられた述語は真である可能性があります。 述語をチェックする「while ループ」等の中に、条件待機を組み込むことをお推めします。 これらの関数を、 PTHREAD_MUTEX_RECURSIVE の mutex で呼び出すと、動作は不定となります。 例pthread_cond_wait() は、それと関連付けられた述語を判定するループで使用するようお推めします。 これにより、発生する可能性のある疑似再開への対処ができます。 pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER; pthread_cond_timedwait() も、ループで使用するようお推めします。 この関数は、述語が真でなくても成功を返すことがあります。 そのため、述語をチェックするループ内で呼び出す必要があります。 時間切れで関数が終了しても、述語は真になっている可能性があります。 時間切れの判定を行う前に、述語のチェックを行ってください。 以下の例では、その他のエラーチェックは何も行っていません。 pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER; |
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|||||||||||||||