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