Когда безопасно уничтожить барьер 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() вернется, все streamи попадут в барьер и продолжатся. Поскольку только одному streamу присваивается возвращаемое значение PTHREAD_BARRIER_SERIAL_THREAD , безопасно использовать это, чтобы условно обернуть код уничтожения следующим образом:

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

Также имейте в EBUSY что pthread_barrier_destroy() вернет результат EBUSY если барьер был в использовании (т. EBUSY Другой stream вызвал pthread_barrier_wait() ).