【发布时间】:2017-03-01 18:24:13
【问题描述】:
我有一个具有三种方法的 .NET 类:Get1()、Get2() 和 Disconnect()。 Get1 和 Get2 可以在两个线程中同时调用,但我需要在 Disconnect 和其他两种方法之间保留互斥锁。换句话说,我不希望它在执行任一“获取”的过程中断开连接。
我可以用两把锁来做到这一点,像这样:
private object lock1 = new object();
private object lock2 = new object();
public void Get1()
{
lock(lock1)
{
// work
}
}
public void Get2()
{
lock(lock2)
{
// work
}
}
public void Disconnect()
{
lock(lock1)
{
lock(lock2)
{
// work
}
}
}
这是实现上述结果的最佳做法吗?我应该担心死锁吗?如果有两个以上的可并行化方法会怎样——拥有 n 个锁似乎不是一个好的解决方案。
【问题讨论】:
-
在 Disconnect 运行时执行 Get1 或 Get2 是否可行,或者它们是否相互排斥?我希望它们是互斥的,但是从您的问题来看,您几乎不希望在获取期间启动断开连接,但可能会在断开连接期间启动获取。
-
我想在这些之间强制执行互斥锁,所以如果在 Disconnect 运行时调用 Get1 或 Get2,调用应该阻塞直到 Disconnect 完成(反之亦然)。
-
是的,使用多个锁会引入更多死锁机会。如果要使用多个锁,规则是您必须始终以相同的顺序获取锁以防止死锁。这需要你在编写锁定代码时保持警惕。此外,如果有多个人倾向于编写某种锁管理器,则可以确保始终以相同的顺序获取锁。
标签: .net multithreading locking mutex