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

条件変数によるブロック

mp が指す相互排他ロックを不可分操作により解放し、 cv が指す条件変数で呼び出しスレッドをブロックするには、pthread_cond_wait(3C) を使用します。

pthread_cond_wait の構文

int pthread_cond_wait(pthread_cond_t *restrict cv,pthread_mutex_t *restrict mutex);
#include <pthread.h>

pthread_cond_t cv;
pthread_mutex_t mp;
int ret;

/* wait on condition variable */
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 を獲得しようとします。

pthread_cond_wait() の位置から実行を続行する前に、待機の条件を再テストする必要があります。呼び起こされたスレッドが mutex を再度獲得して pthread_cond_wait() から戻る前に、条件が変更される可能性があります。また、待機スレッドが誤って呼び起こされる可能性があります。条件チェックを while() ループに入れ、そこで pthread_cond_wait() を呼び出すようにすることをお勧めします。

    pthread_mutex_lock();
        while(condition_is_false)
            pthread_cond_wait();
    pthread_mutex_unlock();

スケジューリングポリシーは、ブロックされたスレッドがどのように呼び起こされるかを決定します。デフォルトスケジューリングポリシー SCHED_OTHER は、スレッドが呼び起こされる順序を指定していません。SCHED_FIFO および SCHED_RR リアルタイムスケジューリングポリシーの下では、スレッドは優先順位に従って呼び起こされます。


注 –

pthread_cond_wait() は取り消しポイントです。保留状態になっている取り消しがあって、呼び出しスレッドが取り消しを有効 (使用可能) にしている場合、そのスレッドは終了し、ロックしている間にクリーンアップハンドラの実行を開始します。


pthread_cond_wait の戻り値

pthread_cond_wait() は、正常終了時に 0 を返します。それ以外の戻り値は、エラーが発生したことを示します。以下の条件が検出されると、この関数は失敗し、次の値を返します。


EINVAL

説明:

cv または mp で指定された値が無効です。