我已经使用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/