【问题标题】:Replacing ReaderWriterLock with ReaderWriterLockSLim - troubles用 ReaderWriterLockSLim 替换 ReaderWriterLock - 麻烦
【发布时间】:2013-08-20 02:26:30
【问题描述】:

由于性能问题,我已将ReaderWriterLock 替换为ReaderWriterLockSlim。我遇到了问题,这是由使用 RWL 时运行正常的代码引起的。

如您所见,有时MethodA(获取write 锁)调用另一个方法(获取read 锁)。第二种方法也是从不同的地方调用的,所以并不总是有锁冲突。以前,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;
   }
}

【问题讨论】:

    标签: c# multithreading locking


    【解决方案1】:

    从 MethodA 对 MethodX 的调用将其限定为对锁的递归使用。
    ReaderWriterLockSlim 见MSDN page 上的备注:

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

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2021-10-12
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-11-11
        • 2011-06-12
        • 1970-01-01
        相关资源
        最近更新 更多