0

すべてがタスクを完了する必要がある pthreads のグループがあり、最後にそれらがタスクを完了するまでブロックしてから、それらすべてを次のタスクに移動させます。これは多くのタスクで発生します。

私は、各タスクの開始時にスレッドの数に等しいカウンターを用意することを考えていました。各スレッドがタスクを終了すると、最後のスレッドがゼロになるまでミューテックスで安全にデクリメントします。タスクの最後に、最後に完了したスレッドを除くすべてのスレッドが pthread_cond_wait を呼び出し、最後のスレッドが pthread_cond_broadcast を呼び出して、他のスレッドに次のタスクに移るように指示します。次に、最後のスレッドは待機せず、代わりにこのタスクも続行します。

ただし、1 つの問題が残っています。カウンターをデクリメントする最後から 2 番目のスレッドが、最後のスレッドが pthread_cond_broadcast を呼び出す前に pthread_cond_wait を呼び出すという保証はありません。

C と POSIX でこれを安全に処理する方法はありますか?

4

2 に答える 2

3

あなたが探しているツールは障壁です。

バリアに到達するのを待っているスレッドの数でバリアを初期化します。

pthread_barrier_init(&barrier, NULL, N);

次に、各スレッドは次を呼び出します。

pthread_barrier_wait(&barrier);

待機は、N 個のスレッドが待機するまでブロックし、待機呼び出しから戻る前に、N 個すべてが (概念的に) ウェイクアップします。

于 2013-02-03T00:26:10.873 に答える
1

pthread_joinを探していると思います。


編集:スレッドを破壊しないようにしようとしていると思います。

pthread_cond_wait次のように、ミューテックスとともに使用することになっています。

int counter;                      // initialized to number of threads
struct pthread_cond_t condition;  // initialized previously
struct pthread_mutex_t mutex;     // initialized previously

pthread_mutex_lock(&mutex);
counter -= 1;
while (counter > 0)
    pthread_cond_wait(&condition, &mutex);
pthread_cond_broadcast(&condition);
pthread_mutex_unlock(&mutex);

これにより、別のセマフォを使用することなく、ロック、カウンター、および条件が処理されます。(基本的に、一種の「逆セマフォ」を実装しています。)

于 2013-02-03T00:11:15.663 に答える