2009-05-17 3 views
5

यदि मेरे पास प्रारंभिक pthread_barrier_t है, तो इसे नष्ट करना सुरक्षित कब है? क्या निम्नलिखित उदाहरण सुरक्षित है?एक पठार बाधा को नष्ट करने के लिए सुरक्षित कब है?

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

उत्तर

5

pthread_barrier_wait() रिटर्न के बाद, सभी धागे बाधा हिट होगा और कार्यवाही कर रहे हैं। इसके अलावा

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

, ध्यान रखें कि pthread_barrier_destroy()EBUSY का एक परिणाम वापस आ जाएगी अगर बाधा प्रयोग में था होना: चूंकि केवल एक धागा PTHREAD_BARRIER_SERIAL_THREAD वापसी मान दिया जाता है, यह है कि उपयोग करने के लिए सुरक्षित है सशर्त तो जैसे विनाश कोड रैप करने के लिए (यानी एक और धागा pthread_barrier_wait() कहा जाता था)।

+4

आपके उत्तर की अंतिम वाक्य गलत है। प्रति POSIX, यह यूबी है: "परिणाम अनिश्चित हैं यदि pthread_barrier_destroy() को बाधा पर अवरुद्ध किया गया है, या यदि इस फ़ंक्शन को एक प्रारंभिक बाधा के साथ बुलाया जाता है।" (Http://pubs.opengroup.org/onlinepubs/9699919799/functions/pthread_barrier_destroy.html) –