谁能给出一个简单的 C# 死锁示例代码?请告诉您在 C# 代码示例中查找死锁的最简单方法。(可能是检测给定示例代码中死锁的工具。)

笔记:我有VS 2008

没有正确的解决方案

其他提示

一个常见的方式是,如果你有不以相同的顺序获取的嵌套锁。线程1可能获得锁A和线程2可能获得锁B和他们会发生死锁。

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();
} 

这是一种典型的代码来创建在C#代码死锁。 结帐这个MSDN文章: http://msdn.microsoft.com/en-us/杂志/ 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();

    }
}

对于死锁示例代码,请尝试使用 lock(this) 在你的班级中模拟死锁场景。查看 这个例子.

以下两篇值得一读的文章检测运行时的死锁并讨论避免死锁的方法。

  1. 死锁监视器 作者:史蒂芬·图布。
  2. 再次定时锁定 作者:伊恩·格里菲斯。

有是实现在C#僵局另一种方式。由于池中的线程.NET 2.0 SP1数量(在以前的版本25)每芯限制为250。

所以,techically,您可以在游泳池启动太多的任务是等待完成另一个异步操作(即通过线程池执行)。因此,在池的任务将不会被释放,异步任务将无法启动,因为没有可用的线程。

您可以找到例子,这里更精确的解释: 编程线程池。死锁

要解答有关死锁检测问题的一部分,我颇有疑虑,这是一般的可能。这是一个类似与停机问题的问题,你不能有效地计算语义。要克服这一点的一种方法是使用一个看门狗这将定期查询每个线程是否还活着,并给它一定的超时回答,如果2个线程不回应,你可以假设他们要么忙或他们是死区锁定。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top