Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/336.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# ReaderWriterLockSlim.EnterUpgradeableReadLock()与Monitor.Enter()基本相同吗?_C#_Multithreading_Readerwriterlockslim - Fatal编程技术网

C# ReaderWriterLockSlim.EnterUpgradeableReadLock()与Monitor.Enter()基本相同吗?

C# ReaderWriterLockSlim.EnterUpgradeableReadLock()与Monitor.Enter()基本相同吗?,c#,multithreading,readerwriterlockslim,C#,Multithreading,Readerwriterlockslim,因此,在这种情况下,我可能会有很多很多次读取,而只是偶尔写入多个线程之间共享的资源 很久以前,我读过关于ReaderWriterLock的文章,也读过关于哪些试图缓解问题的文章,其中许多文章都是特朗普写的,会影响性能。然而,现在我意识到 从文档中,我相信在任何时候只有一个线程处于“可升级模式”。在我使用的唯一访问权限是(适合我的场景)的情况下,只使用lock(){},有什么区别吗 以下是摘录: 试图进入的线程 可升级模式块(如果有) 已经有一个线程处于可升级模式, 如果有线程等待进入 写入模式,

因此,在这种情况下,我可能会有很多很多次读取,而只是偶尔写入多个线程之间共享的资源

很久以前,我读过关于ReaderWriterLock的文章,也读过关于哪些试图缓解问题的文章,其中许多文章都是特朗普写的,会影响性能。然而,现在我意识到

从文档中,我相信在任何时候只有一个线程处于“可升级模式”。在我使用的唯一访问权限是(适合我的场景)的情况下,只使用
lock(){}
,有什么区别吗

以下是摘录:

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


或者,递归策略对此有什么影响吗?

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

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

lock()
{
  //only one thread can access this code at a time
}
问题是多次读取是无害的,但是lock()还是会阻塞。ReaderWriterLockSlim允许多次读取,仅允许一次写入。这是提高效率的一种尝试


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

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

也检查这个答案。当我读到这篇文章时,我发现它很有用: