2012-06-06 12 views
5

क्या कोई मुझे बता सकता है कि हमें नेस्टेड लॉकिंग की आवश्यकता क्यों है? इस उदाहरण कोसी # में नेस्टेड लॉकिंग गलतफहमी?

देखो:

lock (locker) 
    lock (locker) 
    lock (locker) 
     { 
     ... 
     } 

enter image description here

कोई कर सकते हैं के बारे में समझाएं (+ उदाहरण बहुत सराहना की जाएगी)।

+0

क्या आपका मतलब यह है कि हर बार एक ही वस्तु पर लॉक की जांच की जा रही है, या विभिन्न वस्तुओं पर? – Nathan

+0

@Nathan समान obj। –

+0

संबंधित: http://stackoverflow.com/questions/12013089/when-would-you-ever-use-nested-locking –

उत्तर

13

कोई मुझे कृपया समझा सकते हैं कि हम क्यों नेस्टेड लॉकिंग की ज़रूरत है?

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

कोड आप पोस्ट (और किताब आप को देखें) है कि यह कैसे एक इनलाइन परिदृश्य के लिए यह कम करने के द्वारा काम करता है दिखाते हैं। वह 'वास्तविक' कोड नहीं है।

सरल नियम है कि एक धागा है कि पहले से ही लॉक का मालिक इसे फिर से बंद कर सकते हैं और है कि बाहर जाने की संख्या संख्या से मेल खाना चाहिए ताला जारी करने के लिए प्रवेश की है।

+0

मैं थ्रेडिंग के बारे में पढ़ रहा हूं। और इसके लिए एक विशिष्ट अध्याय है जिसे मैं समझ नहीं पा रहा हूं और इसलिए मैं पूछता हूं। http://books.google.co.il/books?id=VENrFSQFco8C&pg=PA813&lpg=PA813&dq=%22A+thread+can+repeatedly+lock+the+same+object+in+a+nested+(reentrant)+fashion% 22 और स्रोत = बीएल और ओ टी एस = 3uU4rnd_9P और sig = 5NNh4Jbi7pVEZrLydrrs_bOhsBc & hl = hi & सा = एक्स और Ei = qQbPT5zGNorV8gP0q424DA और वेद = 0CC0Q6AEwAQ # v = onepage & q =% 22A% 20thread% 20can% 20repeatedly% 20lock% 20the% 20same% 20object% 20in% 20a% 20nested% 20 (रैत्रांत)% 20fashion% 22 और एफ = झूठी –

+0

जब तक कि आप अलग-अलग ताले घोंसले नहीं कर रहे हों ... लेकिन ओपीएस उदाहरण में यह मामला नहीं है ... –

+3

@RoyiNamir पुस्तक से: "एक धागा * कर सकते हैं * एक ही ऑब्जेक्ट को नेस्टेड (पुनर्वित्त) में बार-बार लॉक कर सकते हैं फैशन ", जिसका अर्थ है कि आपको म्यूटेक्स को कई बार लॉक करने की अनुमति है, लेकिन इसकी आवश्यकता नहीं है। – univerio

1

आपको बताए गए अनुसार आपको नेस्टेड लॉकिंग की आवश्यकता नहीं है।

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

संपादित करें: Royi Namir बताते हैं के रूप में, नेस्टेड कार्यों बुला जिनमें से प्रत्येक का अपना ताला धारणात्मक ऊपर उल्लिखित परिदृश्य, लेकिन जिस तरह से सवाल उठाया है का उत्पादन करेगा, यह 3 ताले तरह से किया जा रहा है लग रहा है है एक ही गुंजाइश, एक दूसरे के बाद जो कम समझ में आता है।

+0

http://books.google.co.il/books?id=VENrFSQFco8C&pg=PA813&lpg=PA813&dq=%22A+thread+can+repeatedly+lock+the+same+object+in+a+nested+(reentrant)+fashion % 22 & स्रोत = बीएल और ओ टी एस = 3uU4rnd_9P और sig = 5NNh4Jbi7pVEZrLydrrs_bOhsBc & hl = hi & सा = एक्स और Ei = qQbPT5zGNorV8gP0q424DA और वेद = 0CC0Q6AEwAQ # v = onepage & q =% 22A% 20thread% 20can% 20repeatedly% 20lock% 20the% 20same% 20object% 20in% 20a% 20nested% 20 (रैत्रांत)% 20fashion % 22 और एफ = झूठी –

5

ऐसी स्थितियां हैं कि एक ही धागे पर घोंसले के घोंसले की क्षमता बहुत व्यावहारिक है।

मान लीजिए कि आपके पास कई विधियों वाला एक वर्ग है। मान लीजिए आप इस तरह एक बहुत ही सरल ताला योजना करना चाहते हैं:

class A 
{ 
    public void MethodOne() 
    { 
     using (locker) 
     { 
      ...body... 
     } 
    } 

    public void MethodTwo() 
    { 
     using (locker) 
     { 
      ...body... 
     } 
    } 
} 

अब, अगर MethodOne कॉल MethodTwo, आप MethodTwo की शुरुआत में एक गतिरोध के लिए होता है, अगर वहाँ की निगरानी में एक रैत्रांत ताला क्षमता नहीं था । थ्रेड ने locker के माध्यम से खुद को अवरुद्ध कर दिया होगा।

सौभाग्य से, यह उदाहरण सिर्फ .NET में काम करता है। लॉकर "जानता है" किस धागे ने इसे बंद कर दिया है और कितनी बार और यह केवल (केवल) मालिक के धागे को चलेगा। गिनती का उपयोग यह सुनिश्चित करने के लिए किया जाता है कि अन्य प्रतीक्षा धागे के परिप्रेक्ष्य से अनलॉक केवल MethodTwo से बाहर निकलने के बजाय MethodOne से बाहर निकलने पर ही होता है। तो यह उपयोगी नेस्टेड लॉकिंग का एक उदाहरण है।

दूसरी ओर, उदाहरण के प्रश्न में आपका उल्लेख this book से आते हैं लगता है। लेखक यह स्पष्ट करना चाहते थे कि नेस्टेड लॉकिंग संभव है।नेट, स्वचालित रूप से; लेकिन उनके उदाहरण कोड को विकसित किया गया है और किसी भी कोड में दिखाई देने का इरादा नहीं है जब यह जानने की कोशिश की जा रही है कि लॉकिंग हुड के नीचे कैसे काम करती है।

+0

क्यों डेडलॉक ?? –

+1

मामले में उल्लिखित, विधि दो विधि को लॉक को रिलीज़ करने के लिए इंतजार करेगा, लेकिन विधि एक लॉक को तब तक रिलीज़ नहीं करेगा जब तक कि विधि पूर्ण नहीं हुई => डेडलॉक – Nathan

+1

उत्कृष्ट उदाहरण बीटीडब्ल्यू - +1 – Nathan

2

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

प्रश्न से नमूना कोड में, आंतरिक ताले हमेशा सफल होंगे - क्योंकि आंतरिक लॉक तक पहुंचने के लिए, आप पहले से ही बाहरी लॉक प्राप्त करने में सफल होना चाहिए। आपके थ्रेड में पहले से ही locker पर लॉक है और इसलिए आंतरिक लॉक "स्वचालित रूप से" सफल होता है।

यह आवश्यक और कोई अतिरिक्त थ्रेड सुरक्षा प्रदान नहीं करता है।

हालांकि, जिर्का हनिका के उत्तर में पोस्ट किए गए परिदृश्यों में, इस व्यवहार का अर्थ है कि एक थ्रेड-सुरक्षित सदस्य को किसी अन्य थ्रेड-सुरक्षित सदस्य द्वारा डेडलॉक्स के बारे में चिंता किए बिना बुलाया जा सकता है।

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