【问题标题】:ReaderWriterLockSlim with LockRecursionPolicy.SupportsRecursion vs lockReaderWriterLockSlim 与 LockRecursionPolicy.SupportsRecursion 与锁
【发布时间】:2019-02-07 23:29:15
【问题描述】:

我对@9​​87654322@ SupportsRecursion 的警告感到困惑

来自MSDN

默认情况下,ReaderWriterLockSlim 的新实例是使用 LockRecursionPolicy.NoRecursion 标志并且不允许递归。这 建议所有新开发使用默认策略,因为 递归引入了不必要的复杂性并使您的代码 更容易出现死锁。

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

【问题讨论】:

    标签: c# .net concurrency locking readerwriterlockslim


    【解决方案1】:

    正如here 所解释的,C# 中的lock 关键字基于Monitor 对象,这是一种独占 同步机制。 “独占”意味着,当第一个线程进入临界区时,所有后续线程都被阻塞。

    另一方面,

    ReaderWriterLockSlim 区分 读取器锁写入器锁。 它们旨在用于(并提供改进的并发性)以下场景:有很多读者,但只是偶尔写更新。读取器/写入器锁是非独占的。

    lock 知道它被锁定在哪个线程上,因此如果该线程重新进入临界区,它只会增加一个计数器并继续。

    ReaderWriterLockSlim 处于更复杂的位置。因为它区分了读锁和写锁,并且有时需要锁定写而不产生竞争条件,所以 ReaderWriterLockSlim 提供了一个UpgradableLock,它允许您临时增强写功能的锁定而不必担心竞争当您转换到写入模式时,来自另一个线程的恶意写入导致的情况。

    如您所见,ReaderWriterLockSlim 提供了比lock 更丰富但也更复杂的同步模型。声明您打算使用递归的要求是承认这种额外的复杂性。

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

    【讨论】:

    • 谢谢!是否有/是否可以编写一个既可递归又可升级的读写器锁?所以线程 A 和线程 B 都可以安全地执行 enterLockRead/ enterLockRead/ enterLockWrite/ enterLockWrite/ leaveLockWrite / leaveLockWrite/ leaveLockRead / leaveLockRead ?
    • 我不明白为什么不这样做。但是,请阅读我在帖子中链接的上一篇文章。
    • “我不明白为什么不”如何? ReaderWriterLockSlim 会抛出异常试图从 read 进入 write ?
    • @kofifus:我链接的文章详细解释了如何使用ReaderWriterLockSlim。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多