【问题标题】:Is ReaderWriterLockSlim.EnterUpgradeableReadLock() essentially the same as Monitor.Enter()?ReaderWriterLockSlim.EnterUpgradeableReadLock() 是否与 Monitor.Enter() 本质上相同?
【发布时间】:2010-04-30 14:50:03
【问题描述】:

所以我有这样一种情况,我可能有很多次读取,并且偶尔会写入多个线程之间共享的资源。

很久以前,我读过关于ReaderWriterLock 的文章,并且读过关于ReaderWriterGate 的文章,它试图缓解许多写入胜过读取并损害性能的问题。但是,现在我已经意识到ReaderWriterLockSlim...

从文档中,我相信任何时候都只能有一个线程处于“可升级模式”。在我使用的唯一访问权限是EnterUpgradeableReadLock()(这适用于我的场景)的情况下,坚持使用lock(){} 有很大不同吗?

摘录如下:

试图进入的线程 如果有可升级模式块 已经是可升级模式的线程, 如果有线程等待进入 写模式,或者如果有一个 线程处于写入模式。

或者,递归策略对此有何影响?

【问题讨论】:

标签: c# multithreading readerwriterlockslim


【解决方案1】:

同意。如果所有你的线程都需要获取一个可升级的读锁并且你不能释放一个读锁并获取一个写锁,那么 ReaderWriterLockSlim 并没有比一个简单的独占锁改进.递归不会改变这一点。 RWLS 和避免一直存在的死锁危险的需要非常支持单线程进行写入的模式。

【讨论】:

    【解决方案2】:

    我没有你所有的答案,但我会试一试:

    c#中的lock语句是调用Monitor.Enter和Monitor.Exit的语法糖。效果是一次只有一个线程可以访问锁内的代码。

    lock()
    {
      //only one thread can access this code at a time
    }
    

    这样做的问题是多次读取是无害的,但是 lock() 无论如何都会阻塞。 ReaderWriterLockSlim 允许多次读取,只允许一次写入。这是一种提高效率的尝试。

    递归策略是您必须指定的 - 默认情况下它是关闭的。除此之外不知道更多,但希望能有所帮助。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-02-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多