c# - ReaderWriterLockSlim 和脉冲/等待

标签 c# .net multithreading

是否有等效的 Monitor.PulseMonitor.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);
    }
}

随着越来越多的操作被添加到这个类中(需要对底层 protected 锁进行只读访问),有人建议使用 ReaderWriterLockSlim。我以前从未使用过该类,假设它可以提供一些性能优势,我并不反对它,但前提是我可以保留 Pulse/Wait 设计。

最佳答案

不,基本上。它经过优化以提供一些特定/常见的场景。如果您超出这些场景,它将无法正常工作。如果您需要 Pulse 等,请改用 Monitor

关于c# - ReaderWriterLockSlim 和脉冲/等待,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2691703/

相关文章:

java - Linux 上的多个 Java webapps 总线程限制

c# - 在远程 powershell session 期间复制文件 c# runspace

.net - 是否有任何IL编辑器来更改程序集的字节码?

c# - 使用 StructureMap 传递额外的构造函数参数

.net - 如何在多项目、单一解决方案环境(VS2012)中调用Forms?

.net - 如何在 WSE 3.0 (.NET) 中向 UsernameToken 的 Nonce 元素添加 EncodingType 属性

当我单击调用线程 wait() 的停止按钮时,Java GUI 停止响应

c++ - 如何在成员函数线程中调用回调?

c# - 如何在 C# 中读取 SQL 二进制字段

c# - 我可以在扩展方法中设置 decimal 变量的值吗?