2012-04-09 12 views
12

सी ++ में pthreads का उपयोग करते हुए, आपके धागे में से एक को फोर्क कहने पर आपके अन्य धागे का क्या होता है?एक थ्रेड फोर्क() के रूप में अन्य धागे के साथ क्या होता है?

ऐसा प्रतीत होता है कि धागे का पालन नहीं किया जाता है। मेरे मामले में, मैं एक डिमन बनाने की कोशिश कर रहा हूं और मैं फोर्क() का उपयोग माता-पिता के साथ इसे खत्म करने के लिए बाहर निकलने के साथ करता हूं। हालांकि, कोड के माध्यम से एक नए रास्ते में, मैं कांटा से पहले कुछ और कुछ थ्रेड बना देता हूं। क्या फोर्क के बाद मेरे सभी थ्रेड सृजन को स्थानांतरित करने के बजाय धागे के स्वामित्व को नई फोर्क प्रक्रिया में बदलने का कोई आसान तरीका है?

+0

आप अब तक पता लगा हो सकता है के रूप में, यह एक बहुत बुरा विचार है। यदि आपके पास असली एप्लिकेशन में इस तरह की चिंता है, तो मैं यह जानना चाहता हूं कि आपको ऐसा क्यों करना चाहिए, यह पता लगाने का सही तरीका है कि इसे कैसे किया जाए और उचित रिफैक्टरिंग करें: डी – Dacav

उत्तर

18

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

+1

धागे के साथ क्या होता है कांटा निकास() एस के माता पिता? – WilliamKF

+0

@WilliamKF http://stackoverflow.com/questions/395877/are-child-processes-created-with-fork-automatically-killed-when-the-parent-is –

0

कुछ भी नहीं, जब तक कि नई प्रक्रिया को चलाने वाले धागे से किसी को भी छूट नहीं दी जाती।

0

पॉज़िक्स में जब एक बहुप्रचारित प्रक्रिया कांटेदार होते हैं, तो बाल प्रक्रिया बिल्कुल माता-पिता की एक प्रति की तरह दिखती है, लेकिन जिसमें सभी धागे उनके पटरियों में मृत हो जाते हैं और गायब हो जाते हैं।

धागे ताले रखने वाले बहुत खराब हैं।

इसी कारण से, pthread_atfork नामक एक क्रूड तंत्र है जिसमें आप इस स्थिति के लिए हैंडलर पंजीकृत कर सकते हैं।

म्यूटेक्स का उपयोग करने वाले किसी भी उचित ढंग से लिखित प्रोग्राम मॉड्यूल (और विशेष रूप से पुन: प्रयोज्य मिडलवेयर) को कुछ हैंडलर पंजीकृत करने के लिए pthread_atfork पर कॉल करना होगा, ताकि प्रक्रिया fork पर कॉल करने के लिए प्रक्रिया होने पर गलत व्यवहार न हो।

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

बाल प्रक्रिया में, ऐसा कोई विनाशक नहीं चलता है। पता स्थान की प्रतिलिपि बनाई गई है, लेकिन धागा और इसका धागा विशिष्ट मान नहीं है, इसलिए बच्चे में स्मृति लीक हो जाती है। यह pthread_atfork हैंडलर के साथ भी संभाला जा सकता है और इसे नियंत्रित किया जाना चाहिए।

3

आमतौर पर धागे को फोर्क करना बहुत बुरा होता है। फोर्क की गई प्रक्रिया को माता-पिता की पूरी प्रति माना जाना चाहिए, इसके अलावा धागे को छोड़कर नहीं। एक समारोह pthread_atfork() है जो कभी-कभी मदद करता है। यदि आपको थ्रेड फोर्क करना होगा, तो fork() के तुरंत बाद exec() पर कॉल करना सबसे अच्छा है।

मैं सुझाव है कि आप fork() और pthread_atfork() के प्रलेखन में POSIX डेवलपर्स से चेतावनियां पढ़ें (http://pubs.opengroup.org/onlinepubs/007904975/functions/fork.html और http://pubs.opengroup.org/onlinepubs/007904975/functions/pthread_atfork.html देखें)।

fork() समारोह इस प्रकार नए कार्यक्रमों को चलाने के लिए ही प्रयोग किया जाता है, और एक exec कार्य करने के लिए कार्य करता है कि fork() करने के लिए कॉल और कॉल के बीच कुछ संसाधनों की आवश्यकता को बुलाने की प्रभाव हैं:

fork() प्रलेखन से

अपरिभाषित।