我已经使用ReaderWriterLockSlim一段时间了,到目前为止,它已经满足了我的需求。当我继续微调我的应用程序时,我发现ReaderWriterLockSlim对于我的用例而言不是最理想的选择。

根据文档(以及我的经验),它比作家更喜欢作家(即当读者和作家排队时,作家会得到优先选择)。但是,我需要一个有利于读者的等效的。我了解此类组件的副作用(特别是作家饥饿问题)。

有人可以指向生产准备就绪的等效项吗?谢谢。

最佳答案

根据MSDN,ReaderWriterLockSlim支持作家。这意味着当队列中有读者和作家时,作家将获得优先选择。

这会产生读者饥饿,重现此的测试代码是here
我假设只有在写操作很长时(包括线程上下文切换),才会发生饥饿。至少它总是在我的机器上复制的,所以如果我错了,请告诉我。

另一方面,.net 2.0中的ReaderWriterLock不会降低读取器或写入器的容量,但会降低性能。 Here是先前示例中的修改后的代码,以表明没有饥饿发生。

因此,回到您的问题上-这取决于您需要RW锁具有哪些功能。
递归锁,异常处理,超时-与支持以上所有功能的生产质量RW锁最匹配,并且可能对读者有利的是ReaderWriterLock。

您也可以采用Wiki文章中描述first readers-writers problem的代码,但是当然您需要从上面手动实现所有必需的功能,并且实现会遇到作家匮乏的问题。

锁芯可能看起来像这样:

class AutoDispose : IDisposable
{
  Action _action;
  public AutoDispose(Action action)
  {
    _action = action;
  }
  public void Dispose()
  {
    _action();
  }
}

class Lock
{
  SemaphoreSlim wrt = new SemaphoreSlim(1);
  int readcount=0;

  public IDisposable WriteLock()
  {
    wrt.Wait();
    return new AutoDispose(() => wrt.Release());
  }

  public IDisposable ReadLock()
  {
    if (Interlocked.Increment(ref readcount) == 1)
        wrt.Wait();

    return new AutoDispose(() =>
    {
      if (Interlocked.Decrement(ref readcount) == 0)
         wrt.Release();
    });
  }
}

比较使用3个读取器和3个写入器线程,使用简单的内存中操作的3个实现的性能(使用长阻塞操作将为RWLockSlim产生读取器不足,而对于自定义锁定产生写入器不足):

我确保编译器不会展开工作负载循环,但是可能会有我不知道的其他陷阱,因此请谨慎地进行这些测量。测试的源代码是here

关于c# - 是否有等效于读者的ReaderWriterLockSlim?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/14324748/

10-10 23:59