ReaderWriterLock vs lock {}

ken*_*nny 66 .net c# multithreading

请解释一下主要的区别是什么,何时应该使用什么.
重点关注Web多线程应用程序.

Dar*_*rov 65

lock只允许一个线程同时执行代码.ReaderWriterLock可能允许多个线程同时读取或具有写入的独占访问权限,因此它可能更有效.如果您使用的是.NET 3.5 ReaderWriterLockSlim甚至更快.因此,如果您的共享资源被更频繁地阅读而不是被编写,请使用ReaderWriterLockSlim.使用它的一个很好的例子是你经常阅读的文件(在每个请求上),你很少更新文件的内容.因此,当您从文件中读取时,您输入一个读锁定,以便许多请求可以打开它进行读取,当您决定写入时,请输入写锁定.lock在文件上使用a 基本上意味着您可以一次提供一个请求.

  • "所以它可能更有效":但可能不会,你的代码会更复杂.它应该保留给利基案件. (5认同)
  • @flq:如果您在没有先授予读锁定的情况下允许读取(并确保在完成时释放读锁定),那么您可能不知道何时发出写锁定是安全的,因为您不会跟踪读取有问题的代码块的消费者. (3认同)
  • 推荐使用BTW ReaderWriterLock以支持ReaderWriterLockSlim.如果您选择使用其中一个,请使用后一个. (2认同)

Ian*_*ose 20

如果您有许多线程需要读取数据并且这些线程被阻塞等待锁定并且您不经常需要更改数据,请考虑使用ReaderWriterLock .

但是,ReaderWriterLock可能会阻塞等待写很长时间的线程.

因此,只有在确认您在" 现实生活 "中获得锁定争用时才使用ReaderWriterLock,并且您已确认无法重新设计锁定设计以减少锁定的持续时间.

还要考虑是否不能将共享数据存储在数据库中并让它处理所有锁定,因为如果数据库速度足够快,那么很难让您很难跟踪错误.应用.

某些情况下,您还可以使用Aps.net缓存来处理共享数据,并在数据更改时从缓存中删除该项.下一次读取可以将新副本放入缓存中.

记得

"最好的锁定类型是你不需要的锁定(即不要在线程之间共享数据)."


Ric*_*ard 9

监视和可以与任何引用对象相关联的底层"syncblock" - C#下的基础机制lock- 支持独占执行.只有一个线程可以拥有锁.这简单而有效.

ReaderWriterLock(或者,在V3.5中,更好ReaderWriterLockSlim)提供更复杂的模型.除非您知道它会更有效(即具有支持自己的性能测量),否则应避免使用.

最好的锁定类型是您不需要的锁定(即不在线程之间共享数据).

  • "最好的锁定类型是你不需要的锁定(即不在线程之间共享数据)." (4认同)

Inv*_*ion 6

ReaderWriterLock允许您让多个线程同时保存ReadLock ...这样您的共享数据就可以被多个线程同时使用.一旦请求WriteLock,就不再允许ReadLocks,等待WriteLock的代码被阻塞,直到所有带有ReadLocks的线程都释放它们.

WriteLock只能由一个线程持有,允许您的"数据更新"从代码消耗部分的角度看起来是原子的.

另一方面,Lock只允许一个线程一次进入,而不允许仅仅尝试使用共享数据的线程.

ReaderWriterLockSlim是ReaderWriterLock的一个新的更高性能版本,它更好地支持递归,并且能够让一个线程从一个基本上是ReadLock的Lock移动到WriteLock(UpgradeableReadLock).


Han*_*ant 6

ReaderWriterLock/Slim专门用于帮助您有效锁定多个消费者/单个生产者方案.使用lock语句可以这样做,但效率不高.RWL/S通过积极地自旋锁获取锁来占上风.这也有助于你避免锁定车队,这是一个锁定语句的问题,当一个线程无法获取锁定时,线程放弃其线程量子,使其落后,因为它不会被重新安排一段时间.