2009-05-17 13 views
5

Se ho un pthread_barrier_t inizializzato, quando è sicuro distruggerlo? Il seguente esempio è sicuro?Quando è sicuro distruggere una barriera 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); 
    } 
} 

risposta

5

Dopo pthread_barrier_wait() ritorni, tutte le discussioni avranno colpito la barriera e stanno procedendo. Dal momento che solo un thread viene dato il valore PTHREAD_BARRIER_SERIAL_THREAD di ritorno, è sicuro da usare che per avvolgere in modo condizionale il codice di distruzione in questo modo:

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

Inoltre, essere consapevoli del fatto che pthread_barrier_destroy() restituirà un risultato di EBUSY se la barriera era in uso (cioè un altro thread aveva chiamato pthread_barrier_wait()).

+4

La frase finale della risposta è falsa. Per POSIX, è UB: "I risultati non sono definiti se pthread_barrier_destroy() viene chiamato quando un thread è bloccato sulla barriera o se questa funzione viene chiamata con una barriera non inizializzata." (Http://pubs.opengroup.org/onlinepubs/9699919799/functions/pthread_barrier_destroy.html) –

Problemi correlati