用ReaderWriterLockSLim替换ReaderWriterLock - 麻烦

Tho*_*mas 7 c# multithreading locking

由于性能问题,我已经更换ReaderWriterLockReaderWriterLockSlim.我遇到了麻烦,这是由使用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)

Hen*_*man 8

从MethodA调用MethodX将其限定为锁的递归使用.
请参阅ReaderWriterLockSlim 的MSDN页面上的备注:

默认情况下,使用LockRecursionPolicy.NoRecursion 标志创建ReaderWriterLockSlim的新实例,并且不允许递归.建议对所有新开发使用此默认策略,因为递归会引入不必要的复杂性并使您的代码更容易出现死锁.要简化从使用Monitor或ReaderWriterLock的现有项目的迁移,可以使用该 LockRecursionPolicy.SupportsRecursion 标志创建允许递归的ReaderWriterLockSlim实例.


Joe*_*Joe 5

替换ReaderWriterLockby时要考虑的另一点ReaderWriterLockSlim是后者实现IDisposable.

这会使替换变得复杂——因为任何拥有 a 的类型也ReaderWriterLockSlim必须如此IDisposable