我非常熟悉,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();
}
}
}