プロトタイプ: int pthread_cond_broadcast(pthread_cond_t *cv); |
#include <pthread.h> pthread_cond_t cv; int ret; /* 条件変数すべてがシグナルを受ける */ ret = pthread_cond_broadcast(&cv); |
pthread_cond_broadcast(3THR) は、cv (pthread_cond_wait() で指定された) が指す条件変数でブロックされている、すべてのスレッドのブロックを解除します。スレッドがブロックされていない条件変数に対して pthread_cond_broadcast() を実行しても無視されます。(Solaris スレッドについては、cond_broadcast(3THR)を参照)。
正常終了時は 0 です。それ以外の戻り値は、エラーが発生したことを示します。以下の条件が検出されると、この関数は失敗し、次の値を返します。
pthread_cond_broadcast() は、条件変数でブロックされていたすべてのスレッドにもう一度相互排他ロックを争奪させるので、慎重に使用してください。たとえば、pthread_cond_broadcast() を使用して、可変量のリソースをそのリソースが解放されるときにスレッド間で争奪させることができます (例 4–10 を参照してください)。
上記のコード例の add_resources() で、次の点に注意してください。相互排他ロックの範囲内では、resources の更新と pthread_cond_broadcast() の呼び出しはどちらを先に行なってもかまいません。
pthread_cond_broadcast() は、シグナルを送ろうとしている条件変数で使用されたものと同じ相互排他ロックを獲得した状態で呼び出してください。そうしないと、関連する条件変数が評価されてから pthread_cond_wait() でブロック状態に入るまでの間に条件変数にシグナルが送られる可能性があり、その場合 pthread_cond_wait() は永久に待ち続けることになります。