この実行ループ (疑似コード) を無期限に実行する 4 つのスレッドを持つ pthread ベースのマルチスレッド プログラムがあります。
while(keepRunning)
{
pthread_barrier_wait(&g_stage_one_barrier);
UpdateThisThreadsStateVariables();
pthread_barrier_wait(&g_stage_two_barrier);
DoComputationsThatReadFromAllThreadsStateVariables();
}
これは、ステージ 1 で各スレッドが独自の状態変数を更新するという点で非常にうまく機能します。ステージ 1 では、他のスレッドが他のスレッドの状態変数を読み取っていないため、問題ありません。次に、ステージ 2 では、スレッドが互いの状態を読み取る限り自由に使用できますが、ステージ 2 ではローカル状態変数を変更するスレッドがないため、事実上読み取り専用であるため、問題ありません。
唯一残っている問題は、アプリケーションを終了するときにこれらのスレッドをクリーンかつ確実にシャットダウンするにはどうすればよいかということです。(「クリーンかつ確実に」とは、潜在的なデッドロックや競合状態を導入することなく、理想的には pthread_barrier_wait() 呼び出しからスレッドを強制的に除外するために UNIX シグナルを送信する必要がないことを意味します)
私の main() スレッドはもちろん、スレッドごとに keepRunning を false に設定できますが、各スレッドに対して pthread_barrier_wait() を返すにはどうすればよいでしょうか? AFAICT pthread_barrier_wait() を返す唯一の方法は、4 つのスレッドすべての実行場所を pthread_barrier_wait() 内に同時に配置することですが、一部のスレッドが既に終了している可能性がある場合、これを行うのは困難です。
pthread_barrier_destroy() を呼び出すことは私がやりたいことのように思えますが、スレッドがバリアで待機している可能性がある間にそれを行うのは未定義の動作です。
この問題に対する適切な既知の解決策はありますか?