用ReaderWriterLockSLim替换ReaderWriterLock - 麻烦

时间:2009-11-08 11:31:18

标签: 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;
   }
}

2 个答案:

答案 0 :(得分:8)

MethodA对MethodX的调用将其限定为锁的递归使用 有关ReaderWriterLockSlim的MSDN page的注释:

  

默认情况下,新的实例   ReaderWriterLockSlim是用。创建的   LockRecursionPolicy.NoRecursion   标志,不允许递归。这个   建议所有人使用默认策略   新的发展,因为递归   引入不必要的复杂   并使您的代码更容易发生   死锁。简化迁移   使用Monitor或的现有项目   ReaderWriterLock,你可以使用   LockRecursionPolicy.SupportsRecursion   用于创建实例的标志   ReaderWriterLockSlim允许   递归。

答案 1 :(得分:4)

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

这可以使替换变得复杂 - 因为拥有ReaderWriterLockSlim的任何类型也必须是IDisposable