バリアは、ここで便利な同期方法です。
pthreads では、2 つのバリアを使用できます。それぞれが require に初期化されていますが、多くのスレッドが実行されています。1 つ目は計算が終了した後にスレッドを同期し、2 つ目はスレッドの 1 つが呼び出された後に同期しますX()
。便利なことに、pthread_barrier_waitは、実際に呼び出す N 個の待機中のスレッドの 1 つだけを選択しますX()
。
void *my_thread(void *whatever) { // XXX error checking omitted
while (1) {
int rc;
do_intense_calculations();
// Wait for all calculations to finish
rc = pthread_barrier_wait(&calc_barrier);
// Am I nominated to run X() ?
if (rc == PTHREAD_BARRIER_SERIAL_THREAD) X();
// Wait for everyone, including whoever is doing X()
rc = pthread_barrier_wait(&x_barrier);
}
Runnable 引数を持つJava のCyclicBarrierを使用すると、バリアが 1 つだけでも同じことができます。(Runnable は、すべてのパーティが到着した後、いずれかがリリースされる前に実行されます。)