【问题标题】:Thread deadlock example in C# [closed]C#中的线程死锁示例[关闭]
【发布时间】:2010-03-09 18:13:24
【问题描述】:

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

【问题讨论】:

  • 他没有把它标记为作业。

标签: c# deadlock


【解决方案1】:
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,我来这个问题是为了描述这样的事情。锁获取的顺序在实践中是一个非常普遍的问题。经验法则:如果您需要同时持有 2 个锁,则应以可预测且一致的顺序获取和释放它们。
【解决方案2】:

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

因为每个死锁实例都是 在测试中创建 - 一个 非同步类 – 每个实例 将获得自己的同步 上下文,因此,它自己的锁。什么时候 两个物体相互呼唤, 僵局不会花很长时间 发生(准确地说是一秒钟!) 问题会特别 阴险如果死锁和测试 类是由不同的人编写的 编程团队。它可能是 不合理地期望那些 负责测试类是 即使意识到他们的过犯,让 一个人知道如何解决 它。这与显式相反 锁,通常是死锁 更明显。

【讨论】:

    猜你喜欢
    • 2010-11-08
    • 2011-05-29
    • 2021-06-25
    • 2016-04-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多