2012-01-05 11 views
10

जहां तक ​​मैं समझता हूं, pthread_exit() वास्तव में वापसी के बराबर होती है जब आपको रिटर्न मान के साथ थ्रेड को समाप्त करने की आवश्यकता होती है। जब लोग लगातार तरीके से उपयोग कर सकते हैं, यानी नौकरी करने के लिए, क्यों पाथ्रेड इस तरह के डुप्लिकेट इंटरफ़ेस को परिभाषित करता है?पर्थ्रेड: लोग pthread_exit का उपयोग क्यों परेशान करते हैं?

उत्तर

9

दो कारण है कि मेरे दिमाग में आते हैं: pthread_exit

  1. आप कॉल स्टैक में किसी भी गहराई से एक धागा बाहर निकलने के लिए अनुमति देता है।

  2. Must be called on the main thread if the TLS keys for the main thread are to have their free functions called. और यहाँ के रूप में अच्छी:। "कोई भी रद्द सफाई संचालकों कि धक्का दे दिया गया है और अभी तक नहीं पॉपअप उलटे क्रम में पॉप कर रहे हैं उन्हें पुश किए और फिर मार डाला सब रद्द सफाई संचालकों के बाद मार डाला गया है, अगर धागा कोई धागा-विशिष्ट डेटा है, उपयुक्त विनाशक कार्यों को एक निर्दिष्ट आदेश में बुलाया जाएगा ... pthread_exit() को एक निहित कॉल तब किया जाता है जब थ्रेड के अलावा एक थ्रेड जिसमें मुख्य() को पहली बार प्रारंभिक दिन से रिटर्न आवंटित किया गया था इसे बनाने के लिए इस्तेमाल किया गया था। फ़ंक्शन का रिटर्न वैल्यू थ्रेड की निकास स्थिति के रूप में कार्य करता है। "

+1

सहमत नहीं है। इन दो मामलों में pthread_exit को अभी भी बदले में बदला जा सकता है। –

+3

# 1 के लिए, हाँ, लेकिन ऐसा करने के लिए सुविधाजनक नहीं हो सकता है। # 2 के लिए, यह नहीं कर सकता। मैंने जो लिंक पोस्ट किया है उसे देखें। मैं हाल ही में असली दुनिया में इस में भाग गया। –

+4

@Mengfei: 'pthread_exit()' को केवल 'वापसी' द्वारा प्रतिस्थापित किया जा सकता है यदि आप 'pthread_create()' द्वारा शुरू किए गए फ़ंक्शन में हैं। यदि थ्रेड फ़ंक्शन कॉल स्टैक में गहरा है, तो 'वापसी' वही काम नहीं करेगा। –

3

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

के लिए के रूप में यह वास्तविक अस्तित्व, के अनुसार है documentation:

जब एक धागा धागा के अलावा अन्य जो मुख्य में() पहले रिटर्न शुरू दिनचर्या से लागू किया गया था pthread_exit के लिए एक अंतर्निहित कॉल() किया जाता है इसका इस्तेमाल इसे बनाने के लिए किया गया था। फ़ंक्शन का रिटर्न मान थ्रेड की निकास स्थिति के रूप में कार्य करता है।

तो अगर आप धागे से एक return <some pointer> किया था, या बस अंत पर पहुंच गया, pthread_exit() वैसे भी कहा जाता है। main() से बाहर निकलने के साथ यह वही है, यदि आप return 0 हैं तो आप वास्तव में exit(0) पर कॉल कर रहे हैं। फ़ंक्शन मौजूद होना है, अन्यथा कर्नेल को यह निर्धारित करने का कोई तरीका नहीं होगा कि थ्रेड निकला है या नहीं।