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