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

如果我有一个初始化的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); } } 

pthread_barrier_wait()返回后,所有线程都将触及障碍并正在继续。 由于只有一个线程被赋予PTHREAD_BARRIER_SERIAL_THREAD返回值,因此可以安全地使用它来有条件地包装破坏代码,如下所示:

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

另外,请注意,如果屏障正在使用中, pthread_barrier_destroy()将返回EBUSY的结果(即另一个线程调用了pthread_barrier_wait() )。