C#中的线程死锁示例

Cod*_*der 25 c# deadlock

有人能给出一个如何在C#语言中引起线程死锁的例子吗?

Tan*_*lax 39

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.
    }
}
Run Code Online (Sandbox Code Playgroud)


Jam*_*ack 6

来自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();
}
Run Code Online (Sandbox Code Playgroud)

因为死锁的每个实例都是在Test中创建的 - 一个不同步的类 - 每个实例都会获得自己的同步上下文,因此也会获得自己的锁.当两个对象互相调用时,不会发生死锁(确切地说是一秒钟!)如果死锁和测试类是由不同的编程团队编写的,那么问题就会特别隐蔽.期望那些对测试课负责的人甚至意识到他们的违规行为可能是不合理的,更不用说知道如何解决它了.这与显式锁相反,其中死锁通常更明显.