首頁 > 後端開發 > C++ > 如何在.NET中實現線程安全阻塞隊列?

如何在.NET中實現線程安全阻塞隊列?

DDD
發布: 2025-01-30 04:41:41
原創
847 人瀏覽過

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中文網其他相關文章!

來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板