我可以将Monitor.Pulse
和Monitor.Wait
等效于ReaderWriterLockSlim
吗?
我有一个类,其中封装了对基础队列的多线程访问。为了入队,我获得了一个保护底层队列(和其他几个对象)的锁,然后添加了该项目,并用Monitor.Pulse
锁定了对象,以表示已将某些内容添加到队列中。
public void Enqueue(ITask task)
{
lock (mutex)
{
underlying.Enqueue(task);
Monitor.Pulse(mutex);
}
}
在队列的另一端,我有一个后台线程,该线程在消息到达队列时不断对其进行处理。当队列中没有任何项目时,它将使用
Monitor.Wait
以避免不必要的轮询。 (我认为这是一个很好的设计,但是如果有任何火焰(在合理的范围内)可以帮助我学习其他方法,则欢迎使用。)private void DequeueForProcessing(object state)
{
while (true)
{
ITask task;
lock (mutex)
{
while (underlying.Count == 0)
{
Monitor.Wait(mutex);
}
task = underlying.Dequeue();
}
Process(task);
}
}
随着向该类添加更多操作(要求对受锁保护的基础进行只读访问),有人建议使用
ReaderWriterLockSlim
。我以前从未使用过该类,并且假定它可以提供一些性能上的好处,但我并不反对,但前提是我可以保留Pulse/Wait设计。 最佳答案
不,基本上。它经过优化以提供某些特定/常见的方案。如果您不在这些情况下,它将无法正常工作。如果您需要Pulse
等,请改用Monitor
。
关于c# - ReaderWriterLockSlim和Pulse/Wait,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/2691703/