.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>
メソッドでは、dequeueを試みる前にキューの状態を確認できます。
以上が.NETでスレッドセーフブロッキングキューを実装する方法は?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。