由于性能问题,我已将ReaderWriterLock
替换为ReaderWriterLockSlim
。我遇到了麻烦,这是由使用RWL时正常运行的代码引起的。
如您所见,有时MethodA
(获取写锁)调用另一种方法(获取读锁)。第二种方法也是从不同的地方调用的,因此并不总是存在锁定冲突。以前,AcquiringRead锁定不会导致该问题。
除了放置“if IsRWheld”以外是否有任何解决方案?
问题是这样的:
class Avacado
{
ReaderWriterLockSlim _lock = new ReaderWriterLockSlim();
void MethodA()
{
_lock.TryEnterWriteLock(-1);
LockedList.Add(someItem)
var result = MethodX();
_lock.ExitWriteLock();
}
object MethodX()
{
//if called from MethodA, it will throw an exception
_lock.TryEnterReadLock(-1);
//...some stuff with LockedList...
var result = LockList.Something();
_lock.ExitReadLock();
return result;
}
}
答案 0 :(得分:8)
MethodA对MethodX的调用将其限定为锁的递归使用 有关ReaderWriterLockSlim的MSDN page的注释:
默认情况下,新的实例 ReaderWriterLockSlim是用。创建的
LockRecursionPolicy.NoRecursion
标志,不允许递归。这个 建议所有人使用默认策略 新的发展,因为递归 引入不必要的复杂 并使您的代码更容易发生 死锁。简化迁移 使用Monitor或的现有项目 ReaderWriterLock,你可以使用LockRecursionPolicy.SupportsRecursion
用于创建实例的标志 ReaderWriterLockSlim允许 递归。
答案 1 :(得分:4)
将ReaderWriterLock
替换为ReaderWriterLockSlim
时要考虑的另一点是后者实现IDisposable
。
这可以使替换变得复杂 - 因为拥有ReaderWriterLockSlim
的任何类型也必须是IDisposable
。