什么时候摧毁pthread屏障是否安全?

fma*_*ark 6 c multithreading posix pthreads

如果我有一个初始化的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);
  }
}
Run Code Online (Sandbox Code Playgroud)

Jim*_*vey 5

pthread_barrier_wait()返回时,所有的线程将相继命中屏障和跟进.由于只有一个线程被赋予PTHREAD_BARRIER_SERIAL_THREAD返回值,因此可以安全地使用它来有条件地包装破坏代码,如下所示:

int rc = pthread_barrier_wait(&b)
if ( rc == PTHREAD_BARRIER_SERIAL_THREAD )
{
    pthread_barrier_destroy(&b);
}
Run Code Online (Sandbox Code Playgroud)

此外,请注意,如果屏障正在使用(即另一个线程已调用),pthread_barrier_destroy()将返回结果.EBUSYpthread_barrier_wait()

  • 你的答案的最后一句是错误的.根据POSIX,它是UB:"如果在屏障上阻塞任何线程时调用pthread_barrier_destroy(),或者如果使用未初始化的屏障调用此函数,则结果未定义." (http://pubs.opengroup.org/onlinepubs/9699919799/functions/pthread_barrier_destroy.html) (4认同)