int pthread_cond_broadcast(pthread_cond_t *cv);
#include <pthread.h> pthread_cond_t cv; int ret; /* all condition variables are signaled */ ret = pthread_cond_broadcast(&cv);
スレッドがブロックされていない条件変数に対して pthread_cond_broadcast() を実行しても無視されます。
pthread_cond_broadcast() は、条件変数でブロックされていたすべてのスレッドにもう一度相互排他ロックを争奪させるので、慎重に使用してください。()たとえば、pthread_cond_broadcast() を使用して、可変量のリソースを、解放時にスレッド間で争奪させることができます。例 4–10 を参照してください。
pthread_mutex_t rsrc_lock; pthread_cond_t rsrc_add; unsigned int resources; get_resources(int amount) { pthread_mutex_lock(&rsrc_lock); while (resources < amount) { pthread_cond_wait(&rsrc_add, &rsrc_lock); } resources -= amount; pthread_mutex_unlock(&rsrc_lock); } add_resources(int amount) { pthread_mutex_lock(&rsrc_lock); resources += amount; pthread_cond_broadcast(&rsrc_add); pthread_mutex_unlock(&rsrc_lock); }
add_resources() の部分に注目してください。相互排他ロックの範囲内では、resources の更新と pthread_cond_broadcast() の呼び出しのどちらを先に行なってもかまいません。
関連付けられた条件は、シグナルを送ろうとしている条件変数と同じ mutex ロックを獲得した状態で変更します。そうしないと、これらの条件変数が評価されてから pthread_cond_wait() でブロック状態に入るまでの間に条件変数が変更される可能性があり、その場合 pthread_cond_wait は永久に待ち続けることになります。