6

初期化された pthread_barrier_t がある場合、安全に破棄できるのはいつですか? 次の例は安全ですか?

pthread_barrier_t barrier;
...
int rc = pthread_barrier_wait(b);
if (rc != PTHREAD_BARRIER_SERIAL_THREAD && rc != 0){
  perror("pthread_barrier_wait");
  exit(1);
}

if (id == 0){
  if(pthread_barrier_destroy(&(threads[t_root].info.tmp_barrier))){
    perror("pthread_barrier_destroy");
    exit(1);
  }
}
4

2 に答える 2

5

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

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

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

于 2009-05-17T13:59:51.543 に答える