क्या कोई सी # में एक साधारण डेडलॉक नमूना कोड दे सकता है? और कृपया अपने सी # कोड नमूने में डेडलॉक खोजने का सबसे आसान तरीका बताएं। (उपकरण जो दिया नमूना कोड में मृत लॉक की पहचान करेगा हो सकता है।).NET में डेडलॉक नमूना?
नोट: मैं 2008 वी.एस. है
क्या कोई सी # में एक साधारण डेडलॉक नमूना कोड दे सकता है? और कृपया अपने सी # कोड नमूने में डेडलॉक खोजने का सबसे आसान तरीका बताएं। (उपकरण जो दिया नमूना कोड में मृत लॉक की पहचान करेगा हो सकता है।).NET में डेडलॉक नमूना?
नोट: मैं 2008 वी.एस. है
एक आम तरीका है अगर आप ताले कि उसी क्रम में नहीं प्राप्त कर लिया जाता है नेस्ट है । थ्रेड 1 लॉक ए प्राप्त कर सकता है और थ्रेड 2 लॉक बी प्राप्त कर सकता है और वे डेडलॉक करेंगे।
var a = new object();
var b = new object();
lock(a) {
lock(b) {
}
}
// other thread
lock (b) {
lock(a) {
}
}
संपादित करें: गैर-लॉक उदाहरण .. waithandles का उपयोग करके। मान लीजिए सॉक्रेटीस और डेस्कार्टेस में स्टेक्स हैं और वे दोनों अच्छी तरह से मज़ेदार दार्शनिक होने के कारण, खाने के लिए एक कांटा और चाकू दोनों की आवश्यकता होती है। हालांकि, उनके पास चांदी के केवल एक सेट हैं, इसलिए प्रत्येक के लिए एक बर्तन पकड़ना संभव है और फिर दूसरे के लिए अपने बर्तन को सौंपने के लिए हमेशा के लिए प्रतीक्षा करें।
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();
}
लॉक (ओं) का कोई उदाहरण w/o उपयोग? – DotNetBeginner
जब मैं अपना नमूना कोड चलाता हूं तो मृत लॉक का पता लगाने के बारे में क्या? – DotNetBeginner
लॉक के बिना मृत * लॉक * कैसे प्राप्त किया जाना चाहिए? – Oliver
गतिरोध नमूना कोड के लिए देखें, अपनी कक्षा में lock(this)
का उपयोग कर गतिरोध परिदृश्य अनुकरण करने के लिए प्रयास करें। चेकआउट this example।
दो योग्य पढ़ने वाले लेखों के बाद रनटाइम पर डेडलॉक का पता लगाता है और उनसे बचने के तरीकों पर चर्चा करता है।
+1। कभी भी लॉक का उपयोग न करें (यह) – Jimmy
सी # में डेडलॉक प्राप्त करने का एक और तरीका है। चूंकि पूल में धागे की .NET 2.0 SP1 संख्या प्रति कोर 250 (पिछले संस्करण में 25 से) तक सीमित है।
तो, तकनीकी रूप से, आप पूल में बहुत से कार्य शुरू कर सकते हैं जो किसी अन्य एसिंक ऑपरेशन (जिसे थ्रेड पूल के माध्यम से निष्पादित किया जाता है) के लिए पूरा होने की प्रतीक्षा करें। इसलिए, पूल में कार्य जारी नहीं किया जाएगा और async कार्य शुरू नहीं होगा क्योंकि कोई उपलब्ध थ्रेड नहीं है।
आप उदाहरण और यहाँ और अधिक सटीक विवरण प्राप्त कर सकते हैं: Programming the Thread Pool. Deadlocks
यह सी # कोड में एक गतिरोध पैदा करने के लिए एक विशिष्ट कोड है। चेकआउट इस 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();
}
}
गतिरोध का पता लगाने के बारे में अपने प्रश्न का हिस्सा उत्तर देने के लिए, मैं नहीं बल्कि शक है कि इस सामान्य संभव है। यह रोकथाम की समस्या के सवाल में समान है, आप प्रभावी ढंग से अर्थशास्त्र की गणना नहीं कर सकते हैं। इस पर काबू पाने का एक तरीका एक वॉचडॉग का उपयोग करना है जो समय-समय पर प्रत्येक धागे को मतदान करेगा यदि यह अभी भी जीवित है और इसे उत्तर देने के लिए एक निश्चित टाइमआउट दें, यदि 2 धागे जवाब नहीं देते हैं, तो आप मान सकते हैं कि वे व्यस्त हैं या वे मर चुके हैं- बंद कर दिया।
@DotNetBeginner: सी # .NET जैसी कोई चीज़ नहीं है। –
धन्यवाद मुझे सही करने के लिए बहुत कुछ: डी – DotNetBeginner