2012-11-22 17 views
6

में ताला लगा मैं सी # में बहु सूत्रण सीख रहा हूँ और मैंनेस्टेड सी #

static readonly object _locker = new object(); 

static void Main() 
{ 
    lock (_locker) 
    { 
    AnotherMethod(); 
    // ...some work is going on 
    } 
} 

static void AnotherMethod() 
{ 
    lock (_locker) { Console.WriteLine ("Another method"); } 
} 

मुझे आश्चर्य है कि नीचे एक कोड देखा जब यह नेस्टेड ताला उपयोग करने के लिए आवश्यकता होती है? इस मामले में केवल एक ताला का उपयोग क्यों नहीं करते?

+0

यदि 'AnotherMethod' कहीं और भी (और न केवल' Main' में) प्रयोग किया जाता है ... – Yahia

+1

कोड वास्तव में अनावश्यक है। बाहरी ताला (_locker) आवश्यक नहीं है। सिवाय अगर एक और विधि() सार्वजनिक होगा और कहीं और से उपयोग किया जाएगा। – Matthias

उत्तर

4

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

1

re-entrant कोड की अनुमति देने के लिए।

आपका उदाहरण उचित नहीं है। critical section पर नियंत्रित पहुंच प्रदान करने के लिए ताले का उपयोग किया जाता है।

यदि कोई महत्वपूर्ण अनुभाग किसी अन्य महत्वपूर्ण खंड को आमंत्रित करता है, तो डेडलॉक होगा। इसे रोकने के लिए, पुनः प्रवेश कोड की अनुमति है।

Why do nested locks not cause a deadlock?

+0

मुझे पुन: प्रवेश कोड की अवधारणा को समझ में नहीं आता है। मेरा कोड यहां भी पुनः प्रविष्ट है http://stackoverflow.com/questions/391913/re-entrant-locks-in-c-sharp। इसका इस्तेमाल कब किया जा रहा है? – Alexandre

+0

http://en.wikipedia.org/wiki/Reentrancy_(computing) – Tilak

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