Heim > Backend-Entwicklung > C++ > Wie implementiere ich eine thread-safe Blocking-Warteschlange in .NET?

Wie implementiere ich eine thread-safe Blocking-Warteschlange in .NET?

DDD
Freigeben: 2025-01-30 04:41:41
Original
847 Leute haben es durchsucht

How to Implement a Thread-Safe Blocking Queue in .NET?

Erstellen einer fadenfesten blockierenden Warteschlange in .NET

Multithread -Anwendungen erfordern häufig eine gemeinsame Warteschlange, in der mehrere Threads gleichzeitig Elemente hinzufügen und abrufen. Eine blockierende Warteschlange ist dafür ideal, bei der Warteschlange pausiert, wenn die Warteschlange in der Warteschlange pausiert, wenn die Warteschlange leer ist.

Eine robuste Blockierungswarteschlange

Die folgende verbesserte Implementierung befasst sich mit potenziellen Rassenbedingungen mit Monitor für die Synchronisation und bietet einen anmutigen Verschlussmechanismus:

SizeQueue<T> Implementierung

In diesem Beispiel wird ein synchronisiertes Queue<T> und Monitor für eine effiziente Fadenblockierung und -stlockung verwendet:

<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>
Nach dem Login kopieren

Dieses erweiterte SizeQueue<T> bietet eine Thread-Safe, die die Warteschlange mit einer Close() -Methode für kontrolliertes Herunterfahren blockiert, Deadlocks verhindert und die anmutige Beendigung des Verzehrs von Fäden sicherstellt. Die TryDequeue -Methode ermöglicht die Überprüfung des Zustands der Warteschlange, bevor versucht wird, zu dequeue.

Das obige ist der detaillierte Inhalt vonWie implementiere ich eine thread-safe Blocking-Warteschlange in .NET?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage