स्थिति: मेरे पास सी में लिखा गया एक बहुप्रचारित प्रोग्राम है। यदि थ्रेड फोर्क में से एक है, तो बच्चे की प्रक्रिया को निष्पादन() का उपयोग करके दूसरे स्थान पर बदल दिया जाता है और माता-पिता बच्चे से बाहर निकलने के लिए प्रतीक्षा करते हैं।सी - क्या निष्पादन को बहु-थ्रेडेड प्रक्रिया में तुरंत कांटे का पालन करना पड़ता है?
समस्या: के बाद बच्चे प्रक्रिया कांटा द्वारा बनाई गई है() वहाँ कोड की कुछ लाइनें कि संकलन तर्क निम्नलिखित कार्यकारी() आदेश में इस्तेमाल किया जा रहे हैं।
हाइपोथीसिस मैं) यह सोचते हैं कि बच्चे की प्रक्रिया के बीच के समय में कांटा (द्वारा बनाया जा रहा में सुधार करें और कार्यकारी(), बच्चे प्रक्रिया द्वारा प्रतिस्थापित किया जा हूँ - माता-पिता की एक प्रति की जा रही है - होगा सब माता-पिता के धागे और इसलिए ये धागे चलेंगे - यद्यपि बहुत ही कम अवधि के लिए?
यदि हां, तो फोर्क() के तुरंत बाद exec exec() को सही समाधान है?
उद्धृत मार्ग यह बताता है कि मानक पुस्तकालय (उदाहरण के लिए, stdio, 'atexit',' malloc', धागा निर्माण और विनाश इत्यादि) आंतरिक रूप से सिंक्रनाइज़ेशन संसाधनों का उपयोग कर सकता है जो एक असंगत स्थिति में हो सकता है ' fork'? यदि हां, तो समस्या को हल करने के लिए 'pthread_atfork' का उपयोग कैसे किया जाएगा? –
@ आर, हां, संभवतः। यह पुस्तकालय पर निर्भर करता है। कुछ मामलों में, वे सभी म्यूटेक्स प्री-कांटा को लॉक कर सकते हैं, फिर उन्हें कांटे के तुरंत बाद छोड़ दें। दूसरों में, बस उन्हें फिर से शुरू करना ठीक है जैसे प्रक्रिया खरोंच से शुरू हो रही थी। मैंने 'pthread_atfork 'से एक प्रासंगिक मार्ग जोड़ा है। दूसरे पैराग्राफ में स्पष्टीकरण के लिए –