Tho*_*mas 7 c# multithreading locking
由于性能问题,我已经更换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;
}
}
Run Code Online (Sandbox Code Playgroud)
从MethodA调用MethodX将其限定为锁的递归使用.
请参阅ReaderWriterLockSlim 的MSDN页面上的备注:
默认情况下,使用
LockRecursionPolicy.NoRecursion标志创建ReaderWriterLockSlim的新实例,并且不允许递归.建议对所有新开发使用此默认策略,因为递归会引入不必要的复杂性并使您的代码更容易出现死锁.要简化从使用Monitor或ReaderWriterLock的现有项目的迁移,可以使用该LockRecursionPolicy.SupportsRecursion标志创建允许递归的ReaderWriterLockSlim实例.
替换ReaderWriterLockby时要考虑的另一点ReaderWriterLockSlim是后者实现IDisposable.
这会使替换变得复杂——因为任何拥有 a 的类型也ReaderWriterLockSlim必须如此IDisposable。