C#中的线程死锁示例

时间:2010-03-09 18:13:25

标签: c# deadlock

有人可以举例说明如何在C#语言中引起线程死锁吗?

2 个答案:

答案 0 :(得分:36)

static object object1 = new object();
static object object2 = new object();

public static void ObliviousFunction()
{
    lock (object1)
    {
        Thread.Sleep(1000); // Wait for the blind to lead
        lock (object2)
        {
        }
    }
}

public static void BlindFunction()
{
    lock (object2)
    {
        Thread.Sleep(1000); // Wait for oblivion
        lock (object1)
        {
        }
    }
}

static void Main()
{
    Thread thread1 = new Thread((ThreadStart)ObliviousFunction);
    Thread thread2 = new Thread((ThreadStart)BlindFunction);

    thread1.Start();
    thread2.Start();

    while (true)
    {
        // Stare at the two threads in deadlock.
    }
}

答案 1 :(得分:6)

来自Threading in C#

  

在比例的另一端,   单独的同步上下文   邀请死锁。这是一个例子:

[Synchronization]
public class Deadlock : ContextBoundObject {
    public DeadLock Other;
    public void Demo() { Thread.Sleep (1000); Other.Hello(); }
    void Hello() { Console.WriteLine ("hello"); }
}
public class Test {
    static void Main() {
    Deadlock dead1 = new Deadlock();
    Deadlock dead2 = new Deadlock();
    dead1.Other = dead2;
    dead2.Other = dead1;
    new Thread (dead1.Demo).Start();
    dead2.Demo();
}
  

因为死锁的每个实例都是   在Test中创建 - 一个   非同步类 - 每个实例   将获得自己的同步   上下文,因此,它自己的锁。什么时候   这两个物体相互呼唤,   没过多久就陷入僵局   发生(一秒钟,确切地说!)   问题尤其严重   如果死锁和测试阴险   课程由不同的人写成   编程团队。它可能是   期望那些是不合理的   负责Test类   我们甚至意识到他们的违法行为   独自知道如何解决   它。这与显性相反   锁,通常是死锁   更明显。