ホームページ > バックエンド開発 > C++ > .NETでスレッドセーフブロッキングキューを実装する方法は?

.NETでスレッドセーフブロッキングキューを実装する方法は?

DDD
リリース: 2025-01-30 04:41:41
オリジナル
847 人が閲覧しました

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

.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>メソッドでは、dequeueを試みる前にキューの状態を確認できます。

以上が.NETでスレッドセーフブロッキングキューを実装する方法は?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート