2009-05-17 13 views
5

Если у меня есть инициализированный pthread_barrier_t, когда можно его уничтожить? Безопасен ли следующий пример?Когда можно безопасно уничтожить барьер pthread?

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); 
    } 
} 

ответ

5

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()).

+4

Последнее предложение вашего ответа неверно. В POSIX это UB: «Результаты не определены, если pthread_barrier_destroy() вызывается, когда на барьере блокируется какой-либо поток, или если эта функция вызывается с неинициализированным барьером». (Http://pubs.opengroup.org/onlinepubs/9699919799/functions/pthread_barrier_destroy.html) –

 Смежные вопросы

  • Нет связанных вопросов^_^