pthread バリアを安全に破棄できるのはいつですか?

pthread_barrier_wait()以降 戻ると、すべてのスレッドがバリアにヒットし、処理が続行されます。 PTHREAD_BARRIER_SERIAL_THREAD が与えられるスレッドは 1 つだけなので、 戻り値は、次のように条件付きで破棄コードをラップするために使用しても安全です:

int rc = pthread_barrier_wait(&b)
if ( rc == PTHREAD_BARRIER_SERIAL_THREAD )
{
    pthread_barrier_destroy(&b);
}

また、pthread_barrier_destroy() に注意してください。 EBUSY の結果を返します バリアが使用されていた場合 (つまり、別のスレッドが pthread_barrier_wait() を呼び出していた場合) ).


受け入れられた答えは正しくありません。 PTHREAD_BARRIER_SERIAL_THREAD の戻り値は、バリアを安全に破壊できるという意味ではありません。

バリアを破壊する前に、追加の同期が必要です。

この問題では、ユーザーはサンプル コードと同じロジックを実行しています。https://groups.google.com/forum/#!topic/thread-sanitizer/81idLTirikQ