2009-05-17 11 views
5

Wenn ich eine pthread_barrier_t initialisiert habe, wann ist es sicher, sie zu zerstören? Ist das folgende Beispiel sicher?Wann kann eine Pthread-Barriere sicher zerstört werden?

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

Antwort

5

Nachdem pthread_barrier_wait() zurückkehrt, werden alle Threads die Barriere getroffen haben und fortfahren. Da nur ein Thread des PTHREAD_BARRIER_SERIAL_THREAD Rückgabewert gegeben ist, dann ist es sicher, dass zu verwenden, um bedingt die Zerstörung Code zu wickeln etwa so:

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

Auch bewusst sein, dass pthread_barrier_destroy() ein Ergebnis von EBUSY zurück, wenn die Sperre in Gebrauch war (dh ein anderer Thread hatte pthread_barrier_wait() aufgerufen).

+4

Der letzte Satz Ihrer Antwort ist falsch. Pro POSIX ist es UB: "Die Ergebnisse sind nicht definiert, wenn pthread_barrier_destroy() aufgerufen wird, wenn ein Thread auf der Barriere blockiert ist, oder wenn diese Funktion mit einer nicht initialisierten Barriere aufgerufen wird." (http://pubs.opengroup.org/onlinepubs/9699919799/functions/pthread_barrier_destroy.html) –

Verwandte Themen