Heim > Backend-Entwicklung > C++ > Wie implementiere ich eine thread-sichere Blockierungswarteschlange mit Größengrenzen in .NET?

Wie implementiere ich eine thread-sichere Blockierungswarteschlange mit Größengrenzen in .NET?

DDD
Freigeben: 2025-01-30 04:36:09
Original
266 Leute haben es durchsucht

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

Die Thread -Sicherheit blockiert die Warteschlange im Thread in .NET

In der Szene, in der gleichzeitig auf Multi -Thread -Zugriffs -Warteschlangen zugegriffen werden, ist die Größe der Kontrollwarteschlange entscheidend, um das unendliche Wachstum der Warteschlange zu verhindern. In diesem Artikel wird die Methode zum Erstellen einer benutzerdefinierten Blockierungswarteschlange im .NET erörtert.

Eine einfache Lösung besteht darin, die Sammlung als Grundlage der Warteschlange zu verwenden und

(_fullevent) zu verwenden, um den zusätzlichen Thread zu blockieren, wenn die Warteschlange das angegebene Maximum (maxSize) erreicht. Beim Entfernen des Projekts wird ein _fullevent -Signal ausgestellt, um das Team zuzulassen.

AutoResetEvent Aufgrund der unzureichenden Synchronisation ist die Sicherheit dieser Implementierung jedoch besorgniserregend. Die Verbesserungsmethode besteht darin, den standardisierten Warteschlangentyp zu verwenden und das Synchronelement zu verwenden, um die Management -Obstruktion anzuzeigen.

Der folgende Code zeigt die Implementierung der verbesserten:

Diese Erkenntnis liefert einen Mechanismus, der eine sichere und effiziente Warteschlangengröße durch Verwendung einer gebauten Synchronisationsstruktur bietet. Darüber hinaus enthält es auch die Funktion, die Warteschlange elegant zu schließen, sodass der Leser sauber verlassen kann.
<code class="language-csharp">class SizeQueue<T>
{
    private readonly Queue<T> queue = new Queue<T>();
    private readonly int maxSize;

    public SizeQueue(int maxSize) { this.maxSize = maxSize; }

    public void Enqueue(T item)
    {
        lock (queue)
        {
            while (queue.Count >= maxSize)
            {
                Monitor.Wait(queue);
            }
            queue.Enqueue(item);
            if (queue.Count == 1)
            {
                // 唤醒任何被阻塞的出队操作
                Monitor.PulseAll(queue);
            }
        }
    }

    public T Dequeue()
    {
        lock (queue)
        {
            while (queue.Count == 0)
            {
                Monitor.Wait(queue);
            }
            T item = queue.Dequeue();
            if (queue.Count == maxSize - 1)
            {
                // 唤醒任何被阻塞的入队操作
                Monitor.PulseAll(queue);
            }
            return item;
        }
    }
}</code>
Nach dem Login kopieren

Das obige ist der detaillierte Inhalt vonWie implementiere ich eine thread-sichere Blockierungswarteschlange mit Größengrenzen 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