3

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

很久以前,我读到了ReaderWriterLock,并且已经读到了ReaderWriterGate哪些尝试来缓解许多写入胜过读取并损害性能的问题。然而,现在我已经意识到ReaderWriterLockSlim...

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

这是摘录:

如果已经有线程处于可升级模式,如果有线程等待进入写入模式,或者如果有单个线程处于写入模式,则尝试进入可升级模式的线程会阻塞。

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

4

2 回答 2

4

同意。如果您的所有线程都需要获取可升级的读锁,而您无法释放读锁并获取写锁,那么 ReaderWriterLockSlim 与简单的独占锁相比没有任何改进。递归不会改变这一点。RWLS 和避免永远存在的死锁危险的需要非常有利于单线程进行写入的模式。

于 2010-04-30T17:17:37.690 回答
0

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

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

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

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

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

于 2010-04-30T16:01:39.077 回答