gpt4 book ai didi

c# - 使用 lock(this) 说明死锁的示例代码

转载 作者:IT王子 更新时间:2023-10-29 04:12:53 25 4
gpt4 key购买 nike

我读过几篇文章和帖子说 lock(this), lock(typeof(MyType)), lock("a string") 都是不好的做法,因为另一个线程可能锁定同一个键并导致死锁。为了理解这个问题,我试图创建一些示例代码来说明死锁,但一直无法解决这个问题。

有人可以写一段简洁的代码来说明这个经典问题吗?请保持简短,我只能消化较小块的代码。

编辑:我认为 lassevk 总结得很好;真正的问题是你失去了对锁的控制。一旦发生这种情况,您将无法控制调用锁的顺序,并且您正在允许潜在的死锁情况。

lock(this)lock(typeof(MyType)) 等都是您选择了无法控制的锁的情况。

最佳答案

只有当你有多个锁时才会发生死锁。你需要这样一种情况,两个线程都持有另一个需要的资源(这意味着必须至少有两个资源,并且两个线程必须尝试以不同的顺序获取它们)

举个简单的例子:

// thread 1
lock(typeof(int)) {
Thread.Sleep(1000);
lock(typeof(float)) {
Console.WriteLine("Thread 1 got both locks");
}

}

// thread 2
lock(typeof(float)) {
Thread.Sleep(1000);
lock(typeof(int)) {
Console.WriteLine("Thread 2 got both locks");
}
}

假设两个线程在彼此之间的一秒内启动,它们都有时间在任何人获得内部锁之前获取第一个锁。如果没有 Sleep() 调用,其中一个线程很可能有时间在另一个线程启动之前获取和释放两个锁。

关于c# - 使用 lock(this) 说明死锁的示例代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/894037/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com