首頁 > 後端開發 > C++ > 如何在.NET中實現具有尺寸限制的線程安全阻塞隊列?

如何在.NET中實現具有尺寸限制的線程安全阻塞隊列?

DDD
發布: 2025-01-30 04:36:09
原創
266 人瀏覽過

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

.NET 中的線程安全阻塞隊列

在多線程同時訪問隊列進行讀寫操作的場景中,控制隊列大小對於防止隊列無限增長至關重要。本文討論在 .NET 中創建自定義阻塞隊列實現的方法。

一個簡單的方案是使用集合作為隊列的基礎,並使用 AutoResetEvent (_FullEvent) 在隊列達到指定最大大小 (MaxSize) 時阻塞添加線程。移除項目時,發出 _FullEvent 信號以允許入隊。

然而,由於同步不足,這種實現的安全性令人擔憂。改進的方法是利用標準化的隊列類型,並使用同步基元顯式管理阻塞。

以下代碼展示了改進後的實現:

<code class="language-csharp">class SizeQueue<T>
{
    private readonly Queue<T> queue = new Queue<T>();
    private readonly int maxSize;

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

    public void Enqueue(T item)
    {
        lock (queue)
        {
            while (queue.Count >= maxSize)
            {
                Monitor.Wait(queue);
            }
            queue.Enqueue(item);
            if (queue.Count == 1)
            {
                // 唤醒任何被阻塞的出队操作
                Monitor.PulseAll(queue);
            }
        }
    }

    public T Dequeue()
    {
        lock (queue)
        {
            while (queue.Count == 0)
            {
                Monitor.Wait(queue);
            }
            T item = queue.Dequeue();
            if (queue.Count == maxSize - 1)
            {
                // 唤醒任何被阻塞的入队操作
                Monitor.PulseAll(queue);
            }
            return item;
        }
    }
}</code>
登入後複製

此實現通過使用內置同步結構提供了一種安全高效的限制隊列大小的機制。此外,它還包括優雅地關閉隊列的功能,允許讀取器乾淨地退出。

<code class="language-csharp">bool closing;

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>
登入後複製

以上是如何在.NET中實現具有尺寸限制的線程安全阻塞隊列?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

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