7

我们有针对 .NET 2.0 RTM 的项目(是的,它应该是 .NET 2.0 RTM,我们有一些正统的客户端)。我只是想知道ReaderWriterLock的缺点是什么?为什么每个人都说“不要使用它,尝试使用其他类似lock声明”的东西如此糟糕?如果我们可以使用 .NET 3.5,我肯定会使用ReaderWriterLockSlim,但ReaderWriterLock我有点害怕所有这些警告来自各处。有没有人测量性能或其他什么?如果存在一些性能问题,我们可以在什么有效负载下遇到它们?

就主要目的而言,我们有一个经典的情况ReaderWriterLock,即多读少写。usinglock语句会阻塞所有读者。也许这对我们来说不是一个可怕的问题,但如果我可以使用ReaderWriterLock我会更满意。IMO 引入多台显示器确实是一个非常非常糟糕的主意。

4

2 回答 2

7

以下几篇文章可以为您提供您正在寻找的想法。

ReaderWriterLockSlim 与 ReaderWriterLock 的性能比较

Rico Mariani 关于使用 ReaderWriterLock 部分这篇文章解释了使用 ReaderWriterLock 的一些成本和场景,也请查看第 1部分和第 2 部分

Jeffrey Richter 谈 ReaderWriterLock 的替代方案

于 2011-04-12T04:13:34.720 回答
1

如果您真的面临 ReaderWriterLock 的理想用例(即多并发读取和少量写入),请使用它!

如果您发现它太慢,还有其他选择。Sanjeevakumar 在他的回答中提供了一些链接。我也会提供一个:
Low-Lock Techniques in action: Implementing a Reader-Writer lock

我将在此处引用该链接的要点:

  1. 按照我的第一篇文章中的建议使用读写器锁。如果锁定性能是一个问题,请将此处的实现作为 .NET System.ReaderWriterLock 的“直接”替代品。在 Microsoft 修复其库中的版本之前,请随意使用此实现。
  2. 自旋锁是一种非常有价值的低锁技术。这里使用了一个干净、简单但高效的读写器锁,用托管代码完全编写。这个锁比我见过的大多数实现要简单得多,但也接近最优。原因是自旋锁的使用极大地简化了锁的设计和分析,而不会牺牲性能。随意使用此处展示的自旋锁实现来制作其他高性能并发构造。
  3. 即使是像 Reader-Writer 锁这样简单的东西,它的行为也有微妙之处(尤其是当您考虑性能问题时)。保持简单真的在这里得到了回报。
于 2011-04-12T04:17:10.183 回答