【发布时间】:2010-05-20 13:17:03
【问题描述】:
我有一种情况,只有在两个 locker 对象空闲时才应该执行一段代码。
我希望会有类似的东西:
lock(a,b)
{
// this scope is in critical region
}
但是,似乎没有这样的事情。那么这是否意味着这样做的唯一方法是:
lock(a)
{
lock(b)
{
// this scope is in critical region
}
}
这甚至会按预期工作吗?虽然代码可以编译,但我不确定它是否能达到我的预期。
【问题讨论】:
-
这不会导致锁定问题吗?假设一个对象锁定 a,另一个锁定 b,现在您将遇到死锁,其中 object1 阻塞 a 等待 b,而 object2 阻塞 b 等待 a。我对锁不太熟悉,但这似乎很糟糕。
-
这就是锁定顺序很重要的原因,正如迄今为止所有答案所提到的那样。有时您需要拥有多个锁,在这些情况下,要使用的标准模式之一是强制(至少通过约定)对锁进行排序。例如,您会说,任何时候您想要获得 b 上的锁,您必须首先获得 a 上的锁。导致更多争用,但防止死锁。尽可能避免这种事情总是更好,但有时这是必要的。
-
@Tester101:是的,我知道如果处理不当会导致死锁。
标签: c# multithreading locking critical-section