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
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() ).
pthread_barrier_destroy()
EBUSY
Source with alternative implementation using pthread_cond
https://groups.google.com/forum/#!topic/thread-sanitizer/81idLTirikQ