我非常熟悉ReaderWriterLockSlim
,但最近在一个类中尝试实现EnterUpgradeableReadLock()
时...很快我意识到当2个或更多线程运行代码时,这几乎肯定会造成死锁:
Thread A --> enter upgradeable read lock
Thread B --> enter upgradeable read lock
Thread A --> tries to enter write lock, blocks for B to leave read
Thread B --> tries to enter write lock, blocks for A to leave read
Thread A --> waiting for B to exit read lock
Thread B --> waiting for A to exit read lock
我在这里漏掉了什么?
编辑
添加了我的情况的代码示例。 Run()
方法将由2个或更多线程同时调用。
public class Deadlocker
{
private readonly ReaderWriterLockSlim _lock = new ReaderWriterLockSlim(LockRecursionPolicy.SupportsRecursion);
public void Run()
{
_lock.EnterUpgradeableReadLock();
try
{
_lock.EnterWriteLock();
try
{
// Do something
}
finally
{
_lock.ExitWriteLock();
}
}
finally
{
_lock.ExitUpgradeableReadLock();
}
}
}