我对ReaderWriterLockSlim非常熟悉,但最近我尝试在一个类中实现EnterUpgradeableReadLock() .当我意识到当两个或更多线程运行代码时,这几乎肯定是一个有保证的死锁:
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();
}
}
}发布于 2014-01-28 16:26:56
我建议避免使用EnterUpgradeableReadLock()。只需使用EnterWriteLock()即可。我知道这似乎是低效的,可升级的读锁几乎和写锁一样糟糕。
发布于 2017-04-25 04:21:52
您的示例中有一个错误
private readonly ReaderWriterLockSlim _lock = new ReaderWriterLockSlim(LockRecursionPolicy.SupportsRecursion);它应该是
private static readonly ReaderWriterLockSlim _lock = new ReaderWriterLockSlim(LockRecursionPolicy.SupportsRecursion);现在,在您的代码中,每当一个类被实例化时,它都在创建ReaderWriterLockSlim的新实例,它无法锁定任何东西,因为每个线程都有它自己的实例。使其静态将强制所有线程使用一个实例,该实例将按其应有的方式工作。
https://stackoverflow.com/questions/21411018
复制相似问题