2010-03-30 19 views
11

क्या कोई सी # में एक साधारण डेडलॉक नमूना कोड दे सकता है? और कृपया अपने सी # कोड नमूने में डेडलॉक खोजने का सबसे आसान तरीका बताएं। (उपकरण जो दिया नमूना कोड में मृत लॉक की पहचान करेगा हो सकता है।).NET में डेडलॉक नमूना?

नोट: मैं 2008 वी.एस. है

+0

@DotNetBeginner: सी # .NET जैसी कोई चीज़ नहीं है। –

+0

धन्यवाद मुझे सही करने के लिए बहुत कुछ: डी – DotNetBeginner

उत्तर

18

एक आम तरीका है अगर आप ताले कि उसी क्रम में नहीं प्राप्त कर लिया जाता है नेस्ट है । थ्रेड 1 लॉक ए प्राप्त कर सकता है और थ्रेड 2 लॉक बी प्राप्त कर सकता है और वे डेडलॉक करेंगे।

var a = new object(); 
var b = new object(); 

lock(a) { 
    lock(b) { 

    } 
} 

// other thread 
lock (b) { 
    lock(a) { 

    } 
} 

संपादित करें: गैर-लॉक उदाहरण .. waithandles का उपयोग करके। मान लीजिए सॉक्रेटीस और डेस्कार्टेस में स्टेक्स हैं और वे दोनों अच्छी तरह से मज़ेदार दार्शनिक होने के कारण, खाने के लिए एक कांटा और चाकू दोनों की आवश्यकता होती है। हालांकि, उनके पास चांदी के केवल एक सेट हैं, इसलिए प्रत्येक के लिए एक बर्तन पकड़ना संभव है और फिर दूसरे के लिए अपने बर्तन को सौंपने के लिए हमेशा के लिए प्रतीक्षा करें।

Dining Philosopher's Problem

WaitHandle fork = new AutoResetEvent(), knife = new AutoResetEvent(); 

while(Socrates.IsHungry) { 
    fork.WaitOne(); 
    knife.WaitOne(); 
    Eat(); 
    fork.Set(); 
    knife.Set(); 
} 

// other thread 
while(Descartes.IsHungry) { 
    knife.WaitOne(); 
    fork.WaitOne(); 
    Eat(); 
    knife.Set(); 
    fork.Set(); 
} 
+0

लॉक (ओं) का कोई उदाहरण w/o उपयोग? – DotNetBeginner

+0

जब मैं अपना नमूना कोड चलाता हूं तो मृत लॉक का पता लगाने के बारे में क्या? – DotNetBeginner

+0

लॉक के बिना मृत * लॉक * कैसे प्राप्त किया जाना चाहिए? – Oliver

1

गतिरोध नमूना कोड के लिए देखें, अपनी कक्षा में lock(this) का उपयोग कर गतिरोध परिदृश्य अनुकरण करने के लिए प्रयास करें। चेकआउट this example

दो योग्य पढ़ने वाले लेखों के बाद रनटाइम पर डेडलॉक का पता लगाता है और उनसे बचने के तरीकों पर चर्चा करता है।

  1. Deadlock monitor स्टीफन टब द्वारा। इयान ग्रिफिथ्स द्वारा
  2. TimedLock Again
+0

+1। कभी भी लॉक का उपयोग न करें (यह) – Jimmy

1

सी # में डेडलॉक प्राप्त करने का एक और तरीका है। चूंकि पूल में धागे की .NET 2.0 SP1 संख्या प्रति कोर 250 (पिछले संस्करण में 25 से) तक सीमित है।

तो, तकनीकी रूप से, आप पूल में बहुत से कार्य शुरू कर सकते हैं जो किसी अन्य एसिंक ऑपरेशन (जिसे थ्रेड पूल के माध्यम से निष्पादित किया जाता है) के लिए पूरा होने की प्रतीक्षा करें। इसलिए, पूल में कार्य जारी नहीं किया जाएगा और async कार्य शुरू नहीं होगा क्योंकि कोई उपलब्ध थ्रेड नहीं है।

आप उदाहरण और यहाँ और अधिक सटीक विवरण प्राप्त कर सकते हैं: Programming the Thread Pool. Deadlocks

5

यह सी # कोड में एक गतिरोध पैदा करने के लिए एक विशिष्ट कोड है। चेकआउट इस MSDN लेख: http://msdn.microsoft.com/en-us/magazine/cc188793.aspx

using System; 

using System.Threading; 


public class Simple { 

    static object A = new object(); 

    static object B = new object(); 


    static void MethodA() 
    { 
     Console.WriteLine("Inside methodA"); 
     lock (A) 
     { 
      Console.WriteLine("MethodA: Inside LockA and Trying to enter LockB"); 
      Thread.Sleep(5000);   
      lock (B) 
      { 
       Console.WriteLine("MethodA: inside LockA and inside LockB"); 
       Thread.Sleep(5000); 
      } 
      Console.WriteLine("MethodA: inside LockA and outside LockB"); 
     } 
     Console.WriteLine("MethodA: outside LockA and outside LockB"); 
    } 

    static void MethodB() 
    { 
     Console.WriteLine("Inside methodB"); 
     lock (B) 
     { 
      Console.WriteLine("methodB: Inside LockB"); 
      Thread.Sleep(5000); 
      lock (A) 
      { 
       Console.WriteLine("methodB: inside LockB and inside LockA"); 
       Thread.Sleep(5000); 
      } 
      Console.WriteLine("methodB: inside LockB and outside LockA"); 
     } 
     Console.WriteLine("methodB: outside LockB and outside LockA"); 
    } 

    public static void Main(String[] args) 
    { 

     Thread Thread1 = new Thread(MethodA); 
     Thread Thread2 = new Thread(MethodB); 
     Thread1.Start(); 
     Thread2.Start(); 
     Console.WriteLine("enter....."); 
     Console.ReadLine(); 

    } 
} 
1

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

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