Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.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#ReaderWriteLock中可升级读锁与写锁的区别_C#_Multithreading - Fatal编程技术网

C#ReaderWriteLock中可升级读锁与写锁的区别

C#ReaderWriteLock中可升级读锁与写锁的区别,c#,multithreading,C#,Multithreading,ReaderWriterLock类中的可升级读锁和写锁有什么区别 根据MSDN描述,只有一个线程可以进入可升级的读锁。如果我没有弄错,我可能会忘记升级它,因为它和写锁一样。 我遗漏了什么?(我想你指的是ReaderWriterLockSlim,因为我认为ReaderWriterLock没有可升级的读取模式。) 尽管只有一个线程可以进入可升级读锁,但一个线程可以拥有可升级读锁,而其他线程仍然可以进入读锁: 在任何给定时间,只有一个线程可以进入可升级模式。如果一个线程处于可升级模式,并且没有线程等待

ReaderWriterLock类中的可升级读锁和写锁有什么区别

根据MSDN描述,只有一个线程可以进入可升级的读锁。如果我没有弄错,我可能会忘记升级它,因为它和写锁一样。 我遗漏了什么?

(我想你指的是
ReaderWriterLockSlim
,因为我认为
ReaderWriterLock
没有可升级的读取模式。)

尽管只有一个线程可以进入可升级读锁,但一个线程可以拥有可升级读锁,而其他线程仍然可以进入读锁:

在任何给定时间,只有一个线程可以进入可升级模式。如果一个线程处于可升级模式,并且没有线程等待进入写入模式,那么任何数量的其他线程都可以进入读取模式,即使有线程等待进入可升级模式

将其与写锁进行比较:

当有线程等待进入写入模式时,尝试进入读取模式或可升级模式的其他线程将阻塞,直到所有等待进入写入模式的线程超时或进入写入模式,然后退出


换句话说,写锁是完全独占的,而可升级的读锁将允许其他线程继续进入/退出读模式,直到需要升级。

我认为UpgradableReadLock是一种特殊的读锁,可以转换为写锁。MSDN声明的是,一次只能有一个线程变成WriteLock。这是合乎逻辑的,因为只能有一个writer。

您的意思是ReaderWriterLockSlim吗?我认为MSDN示例()如果只使用一个写锁,会更简洁。只有在代码中其他地方的相同
ReaderWriterLockSlim
实例上存在读锁时,可升级的读锁才有意义。否则请告诉我。但不仅可升级的锁可以转换为写锁。关键是,与写锁相反,可升级锁不允许写入,也不会阻止其他读卡器,而且一次只能有一个可升级锁。