2011-06-08 18 views
36

मैं किसी दिए गए थ्रेड आईडी के लिए pthread_join को कॉल करना चाहता हूं, लेकिन केवल तभी थ्रेड शुरू हो गया है। सुरक्षित समाधान यह देखने के लिए एक चर जोड़ने के लिए हो सकता है कि कौन सा धागा शुरू हुआ या नहीं। हालांकि, मुझे आश्चर्य है कि अगर pthread_t चर जांचना संभव है, तो निम्न कोड की तरह कुछ।क्या कोई अवैध pthread_t आईडी है?

pthread_t thr1 = some_invalid_value; //0 ? 
pthread_t thr2 = some_invalid_value; 

/* thread 1 and 2 are strated or not depending on various condition */ 
.... 

/* cleanup */ 
if(thr1 != some_invalid_value) 
    pthread_join(&thr1); 

if(thr2 != some_invalid_value) 
    pthread_join(&thr2); 

some_invalid_value कहाँ 0, या एक कार्यान्वयन निर्भर 'PTHREAD_INVALID_ID' मैक्रो

पुनश्च हो सकता है: मेरे धारणा है कि pthread_t प्रकार तुलनीय और आबंटित कर रहे हैं, इस धारणा

पी पी एस के आधार पर: मैं ऐसा करना चाहता था, क्योंकि मैंने सोचा था कि अमान्य थ्रेड आईडी पर pthread_join को कॉल करना अनिश्चित व्यवहार था। यह नहीं। हालांकि, पहले से जुड़े थ्रेड में शामिल होना अनिर्धारित व्यवहार है। अब मान लें कि उपरोक्त "फ़ंक्शन" को बार-बार कहा जाता है। Unconditionnally pthread_join को कॉल करने और परिणाम की जांच करने से परिणामस्वरूप पहले जुड़े थ्रेड पर pthread_join को कॉल किया जा सकता है।

+5

तुम हमेशा pthread_self() ... एक धागा आप शायद में शामिल होने नहीं किया जाएगा ;-) इस्तेमाल कर सकते हैं। पठनीयता की सहायता के लिए 'pthread_t invalid_thread = pthread_self()' का उपयोग कर सकते हैं। –

उत्तर

15

आपका धारणा के साथ शुरू करने के लिए सही नहीं है। pthread_t वस्तुओं अपारदर्शी हैं। आप सीधे सी में pthread_t प्रकारों की तुलना नहीं कर सकते हैं। इसके बजाय आपको pthread_equal का उपयोग करना चाहिए।

एक अन्य विचार है कि अगर pthread_create विफल रहता है, अपने pthread_t की सामग्री को अपरिभाषित हो जाएगा। यह अब आपके अमान्य मूल्य पर सेट नहीं हो सकता है।

मेरी प्राथमिकता pthread_create कॉल (थ्रेड आईडी के साथ) के वापसी मूल्यों को रखना है और यह निर्धारित करने के लिए कि प्रत्येक थ्रेड सही ढंग से शुरू किया गया था या नहीं।

+0

आप ** सी। [Sys/types.h] में सीधे pthread_t प्रकारों की तुलना कर सकते हैं (http://pubs.opengroup.org/onlinepubs/007908799/xsh/systypes.h.html) सभी प्रकारों को परिभाषित किया गया है अंकगणितीय प्रकार (कुछ अपवादों के साथ जो pthread_t को बाहर करते हैं)। मुझे लगता है कि आप का मतलब है कि ** ** की तुलना नहीं करना चाहिए ** pthread_t प्रकारों की तुलना करें – OLL

10

टोनी ने सुझाव दिया रूप में, आप इस स्थिति में pthread_self() उपयोग कर सकते हैं।

लेकिन thread_t== या != का उपयोग कर नहीं तुलना करते हैं। pthread_equal का प्रयोग करें।

pthread_self आदमी पृष्ठ से:

इसलिए, प्रकार pthread_t की चर portably सी समानता ऑपरेटर (==) का उपयोग कर की तुलना नहीं की जा सकता है; इसके बजाय pthread_equal (3) का उपयोग करें।

+2

+1 - अमान्य धागे को ट्रैक करने के लिए अलग झंडे का उपयोग करने के लिए qbert220 की सिफारिश के प्रकाश में विस्तार करने के लिए, यहां उपयोग होगा: 'अगर (pthread_create (& thr, ...)! = 0) thr = pthread_self(); '। –

1

दुर्भाग्य से, सिस्टम पर pthread_t एक सूचक है, pthread_equal() समानता वापस कर सकता है भले ही दो तर्क अलग-अलग धागे का संदर्भ लें, उदा। एक धागा बाहर निकल सकता है और एक नया धागा उसी pthread_t सूचक मूल्य के साथ बनाया जा सकता है।

+0

प्रत्यक्ष तुलना, प्रत्यक्ष रूप से, इस मामले में भी विफल हो जाएगी। :-) – FooF

1

मैं हाल ही में यह एक ही मुद्दे में भाग गया। यदि pthread_create() विफल हुआ, तो मैं अपने phtread_t संरचना में संग्रहीत एक अपरिभाषित, अमान्य मान के साथ समाप्त हुआ। नतीजतन, मैं प्रत्येक थ्रेड से जुड़े एक बूलियन को रखता हूं जो pthread_create() सफल होने पर सत्य पर सेट हो जाता है।

तब सब मैं क्या करने की जरूरत है:

void* status; 
if (my_thread_running) { 
    pthread_join(thread, &status); 
    my_thread_running = false; 
} 
संबंधित मुद्दे