से लिया गया: https://www.gnu.org/software/libc /manual/html_node/Nonreentrancy.html

उदाहरण के लिए, मान लीजिए कि सिग्नल हैंडलर gethostbyname का उपयोग करता है। यह फ़ंक्शन हर बार उसी ऑब्जेक्ट का पुन: उपयोग करते हुए, एक स्थिर वस्तु में अपना मान लौटाता है। यदि सिग्नल कॉल के दौरान gethostbyname पर आता है, या एक के बाद भी (जबकि प्रोग्राम अभी भी मान का उपयोग कर रहा है), तो यह प्रोग्राम द्वारा मांगे गए मान को बंद कर देगा।

मैं यह देखने में विफल रहता हूं कि उपरोक्त परिदृश्य गैर-पुनर्प्रवेशक कैसे है। मुझे ऐसा लगता है कि gethostbyname एक (केवल-पढ़ने के लिए) गेट्टर फ़ंक्शन है जो केवल स्मृति से पढ़ता है (स्मृति को संशोधित करने के विपरीत)। gethostbyname गैर-पुनर्प्रवेशकर्ता क्यों है?

0
Ken Lin 6 जिंदा 2020, 10:34

1 उत्तर

सबसे बढ़िया उत्तर

जैसा कि शब्द कहता है, पुनर्विक्रय किसी फ़ंक्शन की क्षमता को फिर से कॉल करने में सक्षम होने के लिए है, जबकि इसे किसी अन्य थ्रेड में कहा जा रहा है। आपके द्वारा प्रस्तावित परिदृश्य ठीक वही स्थान है जहां पुनर्प्रवेश का प्रयोग किया जाता है। मान लें कि फ़ंक्शन में कुछ static या वैश्विक चर है (जैसा कि gethostbyname(3) फ़ंक्शन करता है) जैसा कि संरचना के लिए रिटर्न बफर एक द्वारा लिखा जा रहा है, दूसरा कॉल पहले लेखन को पूरी तरह से नष्ट करने के लिए इसे ओवरराइट कर सकता है . जब फ़ंक्शन के निष्पादन में इंस्टेंस (बाधित वाला, बाधित नहीं) को फिर से नियंत्रण मिल जाता है, तो इसके सभी डेटा को इंटरप्टिंग द्वारा अधिलेखित कर दिया जाता है, और इसे नष्ट कर दिया जाता है।

इस समस्या को रुकावटों के साथ हल करने का एक सामान्य समाधान यह है कि फ़ंक्शन निष्पादित होने के दौरान इंटरप्ट को अक्षम किया जाए। इस तरह यह अपने आप में एक नई कॉल से बाधित नहीं होता है।

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

स्टेटिक डेटा, जैसे बफ़र्स (stdio buffered पैकेज देखें) आदि का मतलब सामान्य तौर पर, रूटीन रीएंट्रेंट नहीं होगा।

1
Luis Colorado 7 जिंदा 2020, 19:02