ReaderWriterLockSlim.EnterUpgradeableReadLock()和Monitor.Enter()本质上是相同的吗?

3
所以我有这样一种情况,可能有很多读取操作,但只偶尔对多个线程共享的资源进行写入。
很久以前,我了解了ReaderWriterLock,并阅读了关于ReaderWriterGate的文章,它试图缓解许多写操作优先于读操作并影响性能的问题。然而,现在我意识到ReaderWriterLockSlim...
从文档中,我相信在任何时候只能有一个线程处于“可升级模式”。在我仅使用EnterUpgradeableReadLock()(适用于我的场景)的情况下,是否与坚持使用lock(){}没有太大区别?
以下是摘录:

如果已经有一个线程处于可升级模式、有线程在等待进入写模式或者有一个线程处于写模式,那么试图进入可升级模式的线程会被阻塞。

另外,递归策略对此有影响吗?


也可以查看这个答案。当我在阅读这个问题时,我发现它很有用:https://dev59.com/VEzSa4cB1Zd3GeqPo7ny#2494179 - Drew Noakes
2个回答

4

同意。如果您的所有线程都需要获取可升级的读锁,并且您不能释放读锁并获取写锁,那么ReaderWriterLockSlim与简单的独占锁相比没有任何改进。递归也无法改变这一点。 RWLS和避免死锁的必要性极大地支持一个模式,即单个线程执行写操作。


0
我不是所有问题的答案专家,但我会尽力回答:
在C#中,lock语句是调用Monitor.Enter和Monitor.Exit的语法糖。其效果是只有一个线程可以同时访问锁定内的代码。
lock()
{
  //only one thread can access this code at a time
}

这个问题在于多次读取是无害的,但lock()仍然会阻塞。ReaderWriterLockSlim允许多次读取,只允许一次写入。这是为了提高效率而做出的尝试。

递归策略是必须指定的 - 默认情况下是关闭的。除此之外我也不太清楚了,但希望能有所帮助。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接