Maison >développement back-end >C++ >Comment concevoir une file d'attente de blocage en filetage dans .NET?
Construisez une file d'attente de blocage de sécurité de thread dans le .NET
Les limites de la mise en œuvre existante
Méthode d'amélioration
Dans cette version améliorée, le fonctionnement de la file d'attente de la protection des phrases
<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>pour assurer la sécurité des filetages. La classe
est utilisée pour bloquer et soulever le fil de blocage en fonction de l'état de la file d'attente. De plus, les méthodes logo et lock
sont ajoutées à la fermeture élégante de la file d'attente, et la méthode Monitor
est utilisée pour gérer la file d'attente comme vide. closing
Close()
Considération supplémentaire TryDequeue()
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!