2010-11-19 13 views
8

स्थिति: मेरे पास सी में लिखा गया एक बहुप्रचारित प्रोग्राम है। यदि थ्रेड फोर्क में से एक है, तो बच्चे की प्रक्रिया को निष्पादन() का उपयोग करके दूसरे स्थान पर बदल दिया जाता है और माता-पिता बच्चे से बाहर निकलने के लिए प्रतीक्षा करते हैं।सी - क्या निष्पादन को बहु-थ्रेडेड प्रक्रिया में तुरंत कांटे का पालन करना पड़ता है?

समस्या: के बाद बच्चे प्रक्रिया कांटा द्वारा बनाई गई है() वहाँ कोड की कुछ लाइनें कि संकलन तर्क निम्नलिखित कार्यकारी() आदेश में इस्तेमाल किया जा रहे हैं।

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

यदि हां, तो फोर्क() के तुरंत बाद exec exec() को सही समाधान है?

उत्तर

9

केवल fork पर कॉल करने वाला थ्रेड नई प्रक्रिया में चल रहा है। हालांकि, exec से पहले आप कौन से फ़ंक्शंस कॉल कर सकते हैं, इसकी सीमाएं हैं। fork से:

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

मेरा मानना ​​है कि यह मतलब है कि आप आम तौर पर किसी भी रूप में मल्टी-थ्रेडेड पुस्तकालयों pthread_atfork ठीक से उपयोग, ठीक किया जाना चाहिए जब तक।

संपादित करें: pthread_atfork पेज आगे बताते हैं कि कैसे पुस्तकालय अपनी रक्षा कर सकते हैं:

उपयोग की अपेक्षित है कि तैयार हैंडलर सभी म्युटेक्स ताले और अन्य दो कांटा संचालकों उन्हें जारी प्राप्त है।

उदाहरण के लिए, एक आवेदन आपूर्ति कर सकते हैं एक नियमित तैयार कि आवश्यक mutexes पुस्तकालय को बनाए रखता है और आपूर्ति बच्चे और माता पिता के दिनचर्या है कि उन mutexes रिलीज प्राप्त कर लेता है, इस प्रकार सुनिश्चित करना है कि बच्चे का एक संगत स्नैपशॉट हो जाता है लाइब्रेरी की स्थिति (और कोई म्यूटेक्स फंसे हुए हैं)।(उदाहरण के लिए, यह क्या था जब छवि मूल रूप से मार डाला गया था) वैकल्पिक रूप से, कुछ पुस्तकालयों सिर्फ एक बच्चे की दिनचर्या है कि कुछ ज्ञात मूल्य के पुस्तकालय में mutexes और सभी जुड़े राज्यों reinitializes आपूर्ति करने में सक्षम हो सकता है।

+0

उद्धृत मार्ग यह बताता है कि मानक पुस्तकालय (उदाहरण के लिए, stdio, 'atexit',' malloc', धागा निर्माण और विनाश इत्यादि) आंतरिक रूप से सिंक्रनाइज़ेशन संसाधनों का उपयोग कर सकता है जो एक असंगत स्थिति में हो सकता है ' fork'? यदि हां, तो समस्या को हल करने के लिए 'pthread_atfork' का उपयोग कैसे किया जाएगा? –

+0

@ आर, हां, संभवतः। यह पुस्तकालय पर निर्भर करता है। कुछ मामलों में, वे सभी म्यूटेक्स प्री-कांटा को लॉक कर सकते हैं, फिर उन्हें कांटे के तुरंत बाद छोड़ दें। दूसरों में, बस उन्हें फिर से शुरू करना ठीक है जैसे प्रक्रिया खरोंच से शुरू हो रही थी। मैंने 'pthread_atfork 'से एक प्रासंगिक मार्ग जोड़ा है। दूसरे पैराग्राफ में स्पष्टीकरण के लिए –

3

जैसा कि @ मैट्ट्यू ने अपने उत्तर में लिखा था, मूल प्रक्रिया से अन्य धागे बाल प्रक्रिया में मौजूद नहीं होंगे (यदि आप PThreads का उपयोग कर रहे हैं)।

ध्यान दें कि यदि ऐसा नहीं होता है, तो यह फोर्क को कॉल के तुरंत बाद निष्पादन() कॉल करने में मदद नहीं करेगा, क्योंकि अभी भी संभावना है कि अन्य धागे कॉल से पहले भाग लेंगे कार्यकारी()। हालांकि, आप फोर्क() को कॉल करने से पहले एक म्यूटक्स लॉक करके इसे नियंत्रित कर सकते हैं - यह अनिवार्य रूप से कॉल() को कॉल द्वारा नष्ट कर दिया जाएगा।

+0

+1। –

+0

मुझे यकीन नहीं है कि यह म्यूटेक्स के बारे में सही है "अनिवार्य रूप से नष्ट हो रहा है।" जैसा कि मैंने उपरोक्त कहा है, ताले के असंगत राज्य में आने का खतरा है। यही कारण है कि 'pthread_atfork' मौजूद है। –

0

मैंने भी सोचा, सभी थ्रेड भी बाल प्रक्रिया में दोहराए जाएंगे। लेकिन यह सच नहीं है। चूंकि अन्य धागे को बाल प्रक्रिया में दोहराया नहीं जाता है, यदि आप निष्पादन से पहले म्यूटेक्स/ताले का उपयोग कर रहे हैं, तो आपको यह सुनिश्चित करना होगा कि फोर्क हैंडलर उन्हें सही तरीके से संभालने के लिए लिखे गए हों। यहां पर एक लेख है। http://learnwithtechies.com/tech/index.php?option=com_content&view=article&id=15:fork-in-multithreaded-environment&catid=10:unix

संबंधित मुद्दे