2009-05-17 9 views
5

Si j'ai un pthread_barrier_t initialisé, quand est-il prudent de le détruire? L'exemple suivant est-il sécurisé?Quand est-il prudent de détruire une barrière 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); 
    } 
} 

Répondre

5

Après pthread_barrier_wait() retours, toutes les discussions auront atteint la barrière et sont en cours. Comme un seul fil est donné la valeur PTHREAD_BARRIER_SERIAL_THREAD de retour, il est sûr d'utiliser pour envelopper conditionnellement le code de destruction comme ceci:

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

De plus, sachez que pthread_barrier_destroy() retournera un résultat de EBUSY si la barrière était en cours d'utilisation (c'est-à-dire qu'un autre thread avait appelé pthread_barrier_wait()).

+4

La dernière phrase de votre réponse est fausse. Pour POSIX, c'est UB: "Les résultats ne sont pas définis si pthread_barrier_destroy() est appelée quand un thread est bloqué sur la barrière, ou si cette fonction est appelée avec une barrière non initialisée." (http://pubs.opengroup.org/onlinepubs/9699919799/functions/pthread_barrier_destroy.html) –

Questions connexes