.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 中国語 Web サイトの他の関連記事を参照してください。