由于性能问题,我已将 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;
   }
}

最佳答案

从MethodA调用MethodX会将其限定为递归使用锁。
请参阅MSDN page上有关ReaderWriterLockSlim的说明:

关于c# - 用 ReaderWriterLockSLim 替换 ReaderWriterLock - 麻烦,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/1696096/

10-11 22:30