0

つまり、基本的に私が置かれている状況は、1 週間を通してそれぞれが異なる計算を行う多数のスレッドを持っているということです。週の終わりに、すべてのスレッドが関数 X() を呼び出し、次の週の計算を開始して、このサイクルを繰り返します。

ただし、メソッド X() で実際に操作を実行できるスレッドは 1 つだけであり、すべてのスレッドがメソッド X() に到達した場合に限られます。さらに、メソッド X() を使用するようになった 1 つのスレッドが終了するまで、どのスレッドも途中で続行することはできません。

だから私はこれを実装するのに苦労しています。条件変数を使用する必要があるように感じますが、スレッドなどでまだ不安定です。

4

1 に答える 1

1

バリアは、ここで便利な同期方法です。

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 は、すべてのパーティが到着した後、いずれかがリリースされる前に実行されます。)

于 2012-10-31T05:11:01.250 に答える