gpt4 book ai didi

c# - 是否有一个有利于读者的 ReaderWriterLockSlim 等价物?

转载 作者:可可西里 更新时间:2023-11-01 03:10:58 26 4
gpt4 key购买 nike

我一直在使用 ReaderWriterLockSlim一段时间以来,它已经满足了我的需求。当我继续微调我的应用程序时,我发现 ReaderWriterLockSlim 对于我的用例来说略显次优。

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

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

最佳答案

根据 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 的读取器饥饿和自定义锁的写入器饥饿):

Performance comparison

我确保编译器不会展开工作负载循环,但可能还有其他我不知道的陷阱,所以对这些测量持保留态度。测试的源代码是 here .

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

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com