Когда безопасно разрушить защитный барьер? - PullRequest
5 голосов
/ 17 мая 2009

Если у меня есть инициализированный 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);
  }
}

1 Ответ

5 голосов
/ 17 мая 2009

После возврата 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()).

...