首页 > 后端开发 > C++ > 如何设计.NET中的线程安全阻塞队列?

如何设计.NET中的线程安全阻塞队列?

DDD
发布: 2025-01-30 04:51:12
原创
214 人浏览过

How to Design a Thread-Safe Blocking Queue in .NET?

在.NET中构建线程安全阻塞队列

在多线程环境下,多个线程操作同一个队列时,高效的队列管理至关重要。本文探讨如何在.NET中创建一个阻塞队列来满足这一需求。

现有实现的局限性

问题中提供的代码片段展示了一个阻塞队列的基本实现。然而,它缺乏适当的同步机制,可能导致线程安全问题。

改进方法

为了解决原始实现的局限性,请考虑以下改进版本:

<code class="language-csharp">class SizeQueue<T>
{
    private readonly Queue<T> queue = new Queue<T>();
    private readonly int maxSize;
    private bool closing; // 添加关闭标志

    public SizeQueue(int maxSize) { this.maxSize = maxSize; }

    public void Enqueue(T item)
    {
        lock (queue)
        {
            while (queue.Count >= maxSize && !closing) // 检查关闭标志
            {
                Monitor.Wait(queue);
            }
            if(closing) return; // 如果队列已关闭,则直接返回
            queue.Enqueue(item);
            if (queue.Count == 1)
            {
                Monitor.PulseAll(queue);
            }
        }
    }

    public T Dequeue()
    {
        lock (queue)
        {
            while (queue.Count == 0 && !closing) // 检查关闭标志
            {
                Monitor.Wait(queue);
            }
            if(closing && queue.Count == 0) throw new InvalidOperationException("Queue is closed and empty."); // 队列关闭且为空
            T item = queue.Dequeue();
            if (queue.Count == maxSize - 1)
            {
                Monitor.PulseAll(queue);
            }
            return item;
        }
    }

    public void Close()
    {
        lock (queue)
        {
            closing = true;
            Monitor.PulseAll(queue);
        }
    }

    public bool TryDequeue(out T value)
    {
        lock (queue)
        {
            while (queue.Count == 0)
            {
                if (closing)
                {
                    value = default(T);
                    return false;
                }
                Monitor.Wait(queue);
            }
            value = queue.Dequeue();
            if (queue.Count == maxSize - 1)
            {
                Monitor.PulseAll(queue);
            }
            return true;
        }
    }
}</code>
登录后复制

在这个改进版本中,lock语句保护队列操作,确保线程安全。Monitor类用于根据队列的状态阻塞和解除阻塞线程。 此外,添加了closing标志和Close()方法用于优雅地关闭队列,以及TryDequeue()方法用于处理队列为空的情况。

进一步考虑

对于实际应用,可能需要处理队列关闭或需要优雅关闭的情况。为此,代码可以修改如下(如上所示)。

这些增强功能使在队列关闭时能够有序地终止读取线程。 改进后的代码增加了对队列关闭状态的检查,并处理了队列关闭且为空的情况,避免了异常。

以上是如何设计.NET中的线程安全阻塞队列?的详细内容。更多信息请关注PHP中文网其他相关文章!

来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板