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