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

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

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

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

.NETでスレッドセキュリティブロッキングキューを作成

マルチスレッド環境では、複数のスレッドが同じキューを操作する場合、効率的なキュー管理が不可欠です。この記事では、この需要を満たすために.NETでブロッキングキューを作成する方法について説明します。

既存の実装の制限

質問に記載されているコードフラグメントは、ブロッキングキューの基本的な実装を示しています。ただし、適切な同期メカニズムがなく、セキュリティの問題が発生する可能性があります。

改善方法

元の実装の制限を解決するために、次の改善されたバージョンを検討してください。

この改良されたバージョンでは、スレッドの安全性を確保するための

文保護キュー操作。

クラスは、キューのステータスに応じてブロッキングスレッドをブロックおよび持ち上げるために使用されます。 さらに、キューのエレガントな閉鎖にロゴと

のメソッドが追加され、
<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>
ログイン後にコピー
メソッドはキューを空のように処理するために使用されます。

lockさらなる考慮Monitor closing実際のアプリケーションでは、キューが閉じられているか、優雅さの必要性が必要な状況に対処する必要がある場合があります。このため、コードは次のように変更できます(上記のように)。 Close() TryDequeue()これらの強化された関数は、キューが閉じているときに整然とした方法で読み取りスレッドを可能にします。 改善されたコードは、キューの閉鎖のチェックを増やし、キューの閉鎖の状況を処理し、異常を避けます。

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

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