2009-05-17 13 views
5

Eğer bir başlangıç ​​pthread_barrier_t varsa, onu ne zaman imha edebilirim? Aşağıdaki örnek güvenli midir?Bir pthread engelini ne zaman yok etmek güvenlidir?

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

cevap

5

pthread_barrier_wait() döndürür sonra bütün ipler bariyer isabet edecek ve devam ediyor. Sadece bir iplik PTHREAD_BARRIER_SERIAL_THREAD dönüş değeri verilir olduğundan, şartlı şöyle imha kodu sarmak için o kullanımının güvenli olup:

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

Ayrıca bariyer kullanımda ise pthread_barrier_destroy()EBUSY sonucunu döndürecektir unutmayın (başka bir iş parçacığı pthread_barrier_wait() olarak adlandırılmıştı).

+4

Cevabınızın son cümlesi yanlıştır. POSIX'e göre, bu UB'dir: "Eğer bariyer üzerinde herhangi bir iplik engellendiğinde veya bu işlev başlatılmamış bir engelle çağrıldığında pthread_barrier_destroy() çağrılırsa sonuçlar tanımsızdır." (Http://pubs.opengroup.org/onlinepubs/9699919799/functions/pthread_barrier_destroy.html) –

İlgili konular