2010-02-16 19 views
25

क्या कोई मुझे बता सकता है कि कौन से कोड को "पुनः प्रवेश" कोड कहा जा सकता है?किस प्रकार का कोड "पुनः प्रवेश" कहा जा सकता है?

कुछ वास्तविक समय ऑपरेटिंग सिस्टम पढ़ने के दौरान मैं इस शब्द में आया था। कोड को फिर से प्रवेश करने के लिए कोड के लिए क्या विषयों को फंसाना चाहिए?

+3

आश्चर्यजनक रूप से पर्याप्त Google हिट: http://en.wikipedia.org/wiki/Reentrant_(subroutine) –

+0

@ मिच, और यदि कोई आरटीओएस के लिए प्रासंगिक है जो थोड़ा सा अंश देता है और इसे "विषयों" के लिए विशिष्ट बनाता है जिसे "प्रश्न का थोड़ा सा" चुना जाना चाहिए, फिर उम्मीद है कि पहला Google हिट इस सवाल बन जाएगा और इस प्रकार SO .. जो हम सभी चाहते हैं, है ना? =) – Rob

+0

@ रोब: शायद। यह कहना मुश्किल है ..... –

उत्तर

41

आम तौर पर, कोड का एक पुन: प्रवेश ब्लॉक एक ऐसा होता है जिसे पहले के आवेदक के समाप्त होने से पहले किसी अन्य अभिनेता द्वारा दर्ज किया जा सकता है, बिना किसी अभिनेता को कोड के माध्यम से ले जाने वाले पथ को प्रभावित किए बिना। यही है, कोड को फिर से दर्ज करना संभव है, जबकि यह पहले से चल रहा है और अभी भी सही परिणाम उत्पन्न कर रहा है।

ज्यादातर मामलों में, "अभिनेता" एक ही प्रक्रिया के धागे हैं, लेकिन thread safety और फिर से प्रवेशी की अवधारणाओं को आसानी से अलग कर रहे हैं: नहीं हर धागे की सुरक्षित ब्लॉक फिर से प्रवेशी, लेकिन हर फिर से प्रवेशी ब्लॉक थ्रेड-सुरक्षित है। यही है, पुन: प्रवेश थ्रेड सुरक्षा की तुलना में एक मजबूत संपत्ति है। रेमंड चेन से a good example कोड का एक ब्लॉक थ्रेड-सुरक्षित कैसे हो सकता है लेकिन पुन: प्रवेश नहीं कर सकता है।

कोड एक बार फिर से शुरू होने पर एक विशेष मामला है: उसी अभिनेता अपने स्वयं के आमंत्रण समाप्त होने से पहले कोड में कॉल कर रहा है, क्योंकि मार्क ग्रेवेल बताते हैं। सभी सही रिकर्सिव ब्लॉक फिर से प्रवेश कर रहे हैं; बेशक, हर पुन: प्रवेशकर्ता ब्लॉक रिकर्सिव नहीं है।

+0

सभी उत्तरों के लिए धन्यवाद, हालांकि , मैं जवाब के रूप में केवल 1 उत्तर चिह्नित कर सकता हूं। उसके लिए खेद है..: डी – smwikipedia

+1

सभी रिकर्सिव ब्लॉक फिर से प्रवेश नहीं कर रहे हैं। कुछ 8x51 कंपाइलर पर, स्थानीय चर स्थिर आंकड़ों पर संग्रहीत होते हैं। रूटीन जिन्हें रिकर्सिवली कहा जा सकता है, उनमें "उपयोग में" ध्वज होता है; यदि दिनचर्या "उपयोग में" ध्वज सेट होने पर नियमित रूप से प्रवेश करता है, तो यह इसके चर को एक ढेर में कॉपी करेगा और ध्वज को साफ़ करेगा। दिनचर्या से पहले एक कॉल करता है जो रिकर्स कर सकता है, यह "इन-यूज" फ्लैग सेट करता है; एक बार जब कॉल रिटर्न हो जाता है, अगर ध्वज सेट नहीं होता है, तो नियमित रूप से स्टैक से इसके चर को फिर से लोड करता है। रूटीन इस तरह से समर्थन पुनरावृत्ति कोडित, लेकिन फिर से प्रवेश नहीं कर रहे हैं। – supercat

+2

_ "... लेकिन प्रत्येक पुन: प्रवेशकर्ता ब्लॉक थ्रेड-सुरक्षित है।" _ क्या आप [पुनरावृत्ति के बारे में विकिपीडिया प्रविष्टि] पर एक नज़र डालेंगे (http://en.wikipedia.org/wiki/Reentrancy_%28computing% 29)? क्योंकि ऐसे फ़ंक्शन का एक उदाहरण है जो पुनः प्रवेश करने वाला है लेकिन थ्रेड सुरक्षित नहीं है। क्या यह संभव है कि संपादक ने गलती की हो? धन्यवाद। –

1

क्या कोई अन्य धागा कोड को कॉल कर सकता है जबकि पहला धागा इसे चलाने के बीच में होता है? यदि कोड कॉलबैक फ़ंक्शन पर उत्पन्न होता है, तो कॉलबैक फ़ंक्शन पहले रनथ्रू पूरा होने से पहले कोड को कॉल कर सकता है?

यदि कोड ग्लोबल वर्र्स का उपयोग करता है जो लॉक नहीं होते हैं, या इसके अपने स्थिर वर्र्स हैं कि इसमें विशेष सावधानी बरतती है, तो इनमें से कोई भी परिदृश्य इसे तोड़ सकता है।

9

वस्तुतः पुनरावर्ती कोड के किसी भी प्रकार रैत्रांत के रूप में वर्गीकृत किया जा सकता है (यानी आप इसे खत्म कर बिना एक ही विधि में वापस कॉल कर सकते हैं), लेकिन जब ताले, म्युटेक्स, संकेतबाहु आदि के लिए के बारे में बात इस विशेष में प्रयोग किया जाता है उदाहरण के लिए, एक ताला फिर से प्रवेशी है अगर एक बार आप ताला आप सफलतापूर्वक पुन: "ताला" कर सकते हैं कोड (यानी आप अपने आप को गतिरोध नहीं है) है - उदाहरण के लिए:

public void AddIfNecessary(string s) { 
    lock(syncObj) { 
     if(!Contains(s)) Add(s); 
    } 
} 

public void Add(string s) { 
    lock(syncObj) { 
     list.Add(s); 
    } 
} 

public bool Contains(string s) { 
    lock(syncObj) { 
     return list.Contains(s); 
    } 
} 

यहाँ तथ्य यह है कि लॉक फिर से प्रवेश करने का मतलब है कि हम Contains और Add पर कॉल किए बिना चिंता कर सकते हैं कि हमारे पास पहले से ही "ex कोड को सरल बनाना, क्लोज़िव "लॉक। आंतरिक रूप से, एक काउंटर का उपयोग "उपयोग में" ध्वज के बजाय किया जाता है।

10

जॉन Feminella के जवाब का कहना है:

कोड की एक फिर से प्रवेशी ब्लॉक एक है कि पहले के एक मंगलाचरण समाप्त हो गया है से पहले एक और अभिनेता से प्रवेश किया जा सकता है। यही है, यह पहले से चल रहा है, जबकि कोड फिर से दर्ज करना संभव है।

लेकिन यह कोड के गैर-पुन: प्रवेश ब्लॉक के बारे में भी सच है। यदि कोड के ब्लॉक को इस मुद्दे के संबंध में लिखा गया है, तो यह एक दूसरे अभिनेता के साथ एक साथ प्रवेश करने के लिए भी संभव होगा।

समस्या यह है कि यह किसी भी आमंत्रण के परिणामों पर क्या प्रभाव डालता है।तो अधिक सटीक रूप से: एक पुन: प्रवेशकर्ता ब्लॉक एक ऐसा है जिसे पहले के आमंत्रण से पहले किसी अन्य अभिनेता द्वारा दर्ज किया जा सकता है, किसी भी आमंत्रण के परिणाम को बदले बिना।

न तो आमंत्रण दूसरे की "उपस्थिति" का पता लगाने में सक्षम होना चाहिए।

+2

मैंने अभी तक यह जवाब नहीं देखा है! स्पष्टीकरण के लिए धन्यवाद; आप सही हैं कि मैं और अधिक विशिष्ट हो सकता था। मैं तदनुसार संशोधन करूंगा। –

0

एक कंप्यूटर प्रोग्राम को पुनर्विक्रेता कहा जाता है अगर इसे इसके निष्पादन के बीच में बाधित किया जा सकता है और उसके बाद अपने पिछले आमंत्रण पूर्ण निष्पादन से पहले सुरक्षित रूप से फिर से बुलाया जा सकता है। बाधा या कॉल, या एक बाहरी कार्रवाई जैसे हार्डवेयर इंटरप्ट या सिग्नल द्वारा आंतरिक कार्रवाई के कारण बाधा उत्पन्न हो सकती है। एक बार पुनर्निर्मित आमंत्रण पूरा हो जाने के बाद, पिछले आमंत्रण सही निष्पादन फिर से शुरू हो जाएंगे।

+0

विकिपीडिया में संदर्भ जोड़ें? http://en.wikipedia.org/wiki/Reentrant_(subroutine) – greeness

3

पुन: प्रवेश कोड तब होता है जब पृष्ठ एक आम संसाधन साझा करते हैं और संसाधन को बदला या बदला नहीं जाना चाहिए। फिर इस संसाधन को पुनः प्रवेश कोड या शुद्ध कोड के रूप में जाना जाता है।

1

कोड जो समानांतर में चल रहे विभिन्न धागे द्वारा बुलाया जा सकता है। तो, कोड:

  1. स्थानीय चर हो सकता है (प्रत्येक थ्रेड के ढेर पर आवंटित)
  2. , पहरा वैश्विक और स्थैतिक चर होना चाहिए धागे उन्हें साझा करेंगे के बाद से और एक दौड़ नहीं होगा यहां शर्त
0

गैर रैत्रांत उदाहरण

class Test { 
    int count; 

    // Here method1() is not reentrant 
    int method1() 
    { 
     return count + 1; 
    } 
} 

रैत्रांत उदाहरण

class Test { 
    int count; 

    // Here method1() is reentrant 
    int method1(int count) 
    { 
     return count + 1; 
    } 
} 
0

सीधे शब्दों में कहा, एक रैत्रांत कोड एक कोड है जो कई प्रक्रिया के बीच साझा किया जा सकता है।

यह संभव है जब निम्न स्थितियाँ संतुष्ट हैं:

  1. यह वैश्विक और स्थिर डेटा नहीं होना चाहिए।
  2. इसे अपने स्वयं के कोड को संशोधित नहीं करना चाहिए।
  3. इसे किसी अन्य पुन: प्रवेश फ़ंक्शन या कोड सेगमेंट को कॉल नहीं करना चाहिए।

तो, इन शर्तों के बाद एक कोड को फिर से प्रवेश कोड कहा जा सकता है।

+0

मुझे लगता है कि यह वास्तव में सही नहीं है। साझा वस्तुओं में रूटीन दूसरी और तीसरी स्थितियों को पूरा करते हैं लेकिन उनके पास वैश्विक और स्थैतिक डेटा है और वे आपकी परिभाषा के आधार पर पुनः प्रवेशकर्ता हैं क्योंकि उन्हें कई प्रक्रियाओं में साझा किया जाता है। –

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