pthread_cond_wait(3THR) は、mp が指す相互排他ロックを不可分操作により解放し、cv が指す条件変数で呼び出しスレッドをブロックします (Solaris スレッドについては、cond_wait(3THR)を参照)。
プロトタイプ: int pthread_cond_wait(pthread_cond_t *cv,pthread_mutex_t *mutex); |
#include <pthread.h> pthread_cond_t cv; pthread_mutex_t mp; int ret; /* 条件変数でブロック */ ret = pthread_cond_wait(&cv, &mp); |
ブロックされたスレッドを呼び起こすには、pthread_cond_signal() か pthread_cond_broadcast() を使います。また、スレッドはシグナルの割り込みによっても呼び起こされます。
pthread_cond_wait() が戻ったからといって、条件変数に対応する条件の値が変化したと判断することはできません。このため、条件をもう一度評価しなければなりません。
pthread_cond_wait() が戻るときは、たとえエラーを戻したときでも、常に mutex は呼び出しスレッドがロックし保持している状態にあります。
pthread_cond_wait() は、指定の条件変数にシグナルが送られてくるまでブロック状態になります。pthread_cond_wait() は不可分操作により、対応する mutex ロックを解除してからブロック状態に入り、ブロック状態から戻る前にもう一度不可分操作によりロックを獲得します。
通常の用法は次のとおりです。mutex ロックの保護下で条件式を評価します。条件式が偽のとき、スレッドは条件変数でブロック状態に入ります。別のスレッドが条件の値を変更すると、条件変数にシグナルが送られます。その条件変数でブロックされていた (1 つまたは全部の) スレッドは、そのシグナルによってブロックが解除され、もう一度 mutex ロックを獲得しようとします。
呼び起こされたスレッドが mutex を再度獲得して pthread_cond_wait()から戻る前に条件が変わり、また待機しているスレッドが誤って呼び起こされたりすることがあるので、待機の条件を再度テストしてから、 pthread_cond_wait() の場所から実行を再開してください。条件チェックを while() ループに入れ、そこで pthread_cond_wait() を呼び出すようにすることをお勧めします。
pthread_mutex_lock(); while(condition_is_false) pthread_cond_wait(); pthread_mutex_unlock(); |
条件変数で複数のスレッドがブロックされているとき、それらのスレッドが、どの順番でブロックが解除されるかは不定です。
pthread_cond_wait() は取り消しポイントです。保留状態になっている取り消しがあって、呼び出しスレッドが取り消しを有効 (使用可能) にしている場合、そのスレッドは終了し、ロックしている間にクリーンアップハンドラの実行を開始します。
正常終了時は 0 です。それ以外の戻り値は、エラーが発生したことを示します。以下の条件が検出されると、この関数は失敗し、次の値を返します。