スレッド同期-条件変数と信号量


条件変数の詳細
主な関数は次のとおりです.
pthread_cond_init (pthread_cond_t *cond, const pthread_condattr_t *attr); 初期化を行う関数
 
初期化の方法は2種類あり、マクロを直接使用して変数を定義できます.
マクロPTHREAD_を使用可能COND_INITIALIZERは、デフォルト属性を持つように静的に定義された条件変数を初期化します.
pthread_cond_t cv = PTHREAD_COND_INITIALIZER;

 
#include 
int pthread_cond_wait(pthread_cond_t *cv,
pthread_mutex_t *mutex);
   :      0;            

関数はmutexパラメータが指す反発ロックを解除し、現在のスレッドをcvパラメータが指す条件変数にブロックします.
ブロックされたスレッドはpthread_cond_Signal関数、pthread_cond_broadcast関数が起動し、信号が中断された後に起動することもあります.
pthread_cond_wait関数の戻りは,条件の値が一定に変化したという意味ではなく,条件の値を再検査しなければならない.
pthread_cond_wait関数が返されると、対応する反発ロックは、関数エラーが返された場合でも、現在のスレッドによってロックされます.
一般的な条件式は、反発ロックの保護の下でチェックされます.条件式が満たされていない場合、スレッドはこの条件変数にブロックされます.別のスレッドが条件の値を変更し、条件変数に信号を送信すると、この条件変数上の1つのスレッドまたはすべてのスレッドが起動されるのを待って、対応する反発ロックを再び占有しようとする.
条件変数にブロックされたスレッドが起動された後、pthread_cond_wait()関数が返す前の条件の値が変化する可能性があります.したがって、関数が返されると、対応する反発ロックをロックする前に、条件値を再テストする必要があります.最良のテスト方法はpthread_をループ呼び出します.cond_wait関数は,条件を満たす式をループの終端条件とする.次のようになります.
pthread_mutex_lock();
while (condition_is_false)
 pthread_cond_wait();
pthread_mutex_unlock();

同じ条件変数にブロックされた異なるスレッドが解放される順序は一定ではない.
 
心得:
ブロック時にpthread_cond_wait();関数は反発ロックを解放し、他のスレッドに実行を続行させます.
pthread_cond_signal (pthread_cond_t *cond) ;関数は、現在のブロックの条件にのみ有効であり、累計されません.
pthread_cond_broadcast (pthread_cond_t *cond) ;すべてのcondバインドのブロックを起動