【问题标题】:Is there a ReaderWriterLockSlim equivalent that favors readers?是否存在有利于读者的 ReaderWriterLockSlim 等价物?
【发布时间】:2012-12-28 18:50:23
【问题描述】:

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

根据文档(以及我的经验),它有利于作者而不是读者(即,当读者和作者排队时,作者将获得优先权)。但是,我需要一个有利于读者的等价物。我了解此类组件的副作用(尤其是作家饥饿问题)。

是否有人可以指出任何可用于生产的等价物?谢谢。

【问题讨论】:

  • 永远无法最终证明没有代码。但不,这不太可能。请避免询问购物问题。
  • 如果你想支持读取,为什么不直接用更新的克隆替换内部列表呢?您的代码将是无锁的,但更新时会更繁重。
  • 是的,听起来您可以像 jgauffin 建议的那样使用副本来解决这个问题,或者如果数据结构对于廉价副本来说太大了,那么使用写入缓冲区可以减少写入频率。然后,您可以通过上下调整刷新缓冲区的时间来调整读/写平衡。
  • 请问您在保护什么?我最近删除了我对 ReaderWriterLockSlim 的所有使用,效果非常好。

标签: c# .net multithreading concurrency readerwriterlockslim


【解决方案1】:

根据 MSDN,ReaderWriterLockSlim 偏爱作家。这意味着当队列中有读者和作者时,作者将获得优先权。

这会导致读者饥饿,测试代码来重现这是here。 我假设只有在写入是一个涉及线程上下文切换的长操作时才会发生饥饿。至少它总是在我的机器上复制,所以如果我错了,请告诉我。

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

所以,回到您的问题 - 这取决于您需要 RW 锁的哪些功能。 递归锁、异常处理、超时 - 最接近 生产质量 支持上述所有内容的 RW 锁,并且有利于读者的可能是 ReaderWriterLock。

您也可以采用描述 first readers-writers problem 的 wiki 文章中的代码,但当然您需要手动实现上述所有必需的功能,并且实现会出现 writer-starvation 问题。

锁芯大概是这样的:

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

【讨论】:

  • 非常详细的答案!非常感谢 - 我会看看。
猜你喜欢
  • 2013-04-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-03-29
  • 2011-01-16
  • 2020-09-20
  • 2011-06-13
相关资源
最近更新 更多