すべてがタスクを完了する必要がある pthreads のグループがあり、最後にそれらがタスクを完了するまでブロックしてから、それらすべてを次のタスクに移動させます。これは多くのタスクで発生します。
私は、各タスクの開始時にスレッドの数に等しいカウンターを用意することを考えていました。各スレッドがタスクを終了すると、最後のスレッドがゼロになるまでミューテックスで安全にデクリメントします。タスクの最後に、最後に完了したスレッドを除くすべてのスレッドが pthread_cond_wait を呼び出し、最後のスレッドが pthread_cond_broadcast を呼び出して、他のスレッドに次のタスクに移るように指示します。次に、最後のスレッドは待機せず、代わりにこのタスクも続行します。
ただし、1 つの問題が残っています。カウンターをデクリメントする最後から 2 番目のスレッドが、最後のスレッドが pthread_cond_broadcast を呼び出す前に pthread_cond_wait を呼び出すという保証はありません。
C と POSIX でこれを安全に処理する方法はありますか?