代码之家  ›  专栏  ›  技术社区  ›  kofifus

带LockRecursionPolicy.SupportsRecursion和Lock的ReaderWriterLockSlim

  •  0
  • kofifus  · 技术社区  · 6 年前

    我对以下警告感到困惑: ReaderWriterLockSlim SupportsRecursion

    MSDN

    默认情况下,使用 lockRecursionPolicy.norecursion标志,不允许递归。这个 对于所有新开发,建议使用默认策略,因为 递归会带来不必要的复杂性,并使代码 更容易出现僵局。

    我不明白的是为什么这个警告不适用于内置 lock 递归语句?

    1 回复  |  直到 6 年前
        1
  •  1
  •   Robert Harvey    6 年前

    如所解释的 here , the lock C中的关键字基于 Monitor 对象,一个 排他性 同步机制。”“排他”是指当第一个线程进入关键部分时,任何后续线程 此路不通。

    ReaderWriterLockSlim 另一方面,区分 阅读器锁 作家锁。 它们旨在用于(并在中提供改进的并发性)场景,其中有许多读卡器,但只有偶尔的写更新。读写器锁是 非排他性的。

    知道它锁定在哪个线程上,所以如果该线程重新进入关键部分,它只增加一个计数器并继续。

    读写锁操作 处于更复杂的位置。因为它区分读锁和写锁,而且有时需要在不创建争用条件的情况下锁定写,所以readerwriterlockslim提供了 UpgradableLock 这允许您暂时增强写锁功能,而不必担心转换到写模式时另一个线程的恶意写入导致的争用情况。

    正如你所看到的, 读写锁操作 为同步提供了比 做。它要求声明您使用递归的意图是承认这种额外的复杂性。

    进一步阅读
    Synchronization Essentials: Locking
    Advanced Threading: Reader/Writer Locks
    Why Lock Recursion is Generally a Bad Idea Anyway