2009-05-17 14 views
5

Si tengo un pthread_barrier_t inicializado, ¿cuándo es seguro destruirlo? ¿Es seguro el siguiente ejemplo?¿Cuándo es seguro destruir una barrera 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); 
    } 
} 

Respuesta

5

Después pthread_barrier_wait() devoluciones, todas las discusiones se han golpeado la barrera y están avanzando. Dado que sólo un hilo se le da el valor PTHREAD_BARRIER_SERIAL_THREAD retorno, es seguro de usar que para envolver condicionalmente el código de la destrucción de este modo:

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

Además, tenga en cuenta que pthread_barrier_destroy() devolverá un resultado de EBUSY si la barrera estaba en uso (es decir, otro hilo había llamado pthread_barrier_wait()).

+4

La última frase de su respuesta es falsa. Según POSIX, es UB: "Los resultados no están definidos si pthread_barrier_destroy() se invoca cuando un hilo está bloqueado en la barrera, o si se llama a esta función con una barrera no inicializada". (http://pubs.opengroup.org/onlinepubs/9699919799/functions/pthread_barrier_destroy.html) –