首页 >后端开发 >C++ >如何在.NET中实现线程安全阻塞队列?

如何在.NET中实现线程安全阻塞队列?

DDD
DDD原创
2025-01-30 04:41:41852浏览

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

在.net

中构建线程安全阻塞队列

>多线程应用程序通常需要共享队列,其中多个线程同时添加和检索项目。 阻止队列是理想的选择,当队列已满并在队列为空时暂停删除线程时,请暂停添加线程。

以下改进的实施方法使用Monitor进行同步解决潜在的种族条件,并提供了优美的封闭机制:

实现SizeQueue<T>

这个示例利用同步

Queue<T>进行有效的线程阻塞和解密:Monitor

<code class="language-csharp">class SizeQueue<T>
{
    private readonly Queue<T> queue = new Queue<T>();
    private readonly int maxSize;
    private bool closing = false; // Flag for graceful closure

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

    public void Enqueue(T item)
    {
        lock (queue)
        {
            while (queue.Count >= maxSize && !closing) // Check for closure
            {
                Monitor.Wait(queue);
            }
            if (!closing) // Add only if not closing
            {
                queue.Enqueue(item);
                Monitor.PulseAll(queue); // Signal potential dequeue operations
            }
        }
    }

    public T Dequeue()
    {
        lock (queue)
        {
            while (queue.Count == 0 && !closing) // Check for closure
            {
                Monitor.Wait(queue);
            }
            if (!closing) // Dequeue only if not closing
            {
                T item = queue.Dequeue();
                Monitor.PulseAll(queue); // Signal potential enqueue operations
                return item;
            }
            else
            {
                throw new InvalidOperationException("Queue is closed.");
            }
        }
    }

    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();
            Monitor.PulseAll(queue);
            return true;
        }
    }


    public void Close()
    {
        lock (queue)
        {
            closing = true;
            Monitor.PulseAll(queue); // Wake up any waiting threads
        }
    }
}</code>
此增强

提供了一个线程安全的,用一种用于控制关闭的方法阻止队列,防止僵局并确保优雅的消耗线程终止。 SizeQueue<T>方法允许在尝试脱离时检查队列的状态。

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

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn