首頁 >後端開發 >C++ >如何設計.NET中的線程安全阻塞隊列?

如何設計.NET中的線程安全阻塞隊列?

DDD
DDD原創
2025-01-30 04:51:12216瀏覽

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

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn