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