Maison > développement back-end > C++ > Comment concevoir une file d'attente de blocage en filetage dans .NET?

Comment concevoir une file d'attente de blocage en filetage dans .NET?

DDD
Libérer: 2025-01-30 04:51:12
original
214 Les gens l'ont consulté

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

Construisez une file d'attente de blocage de sécurité de thread dans le .NET

Dans un environnement multi-thread, lorsque plusieurs threads exploitent la même file d'attente, une gestion efficace des files d'attente est essentielle. Cet article explique comment créer une file d'attente de blocage dans le .NET pour répondre à cette demande.

Les limites de la mise en œuvre existante

Le fragment de code fourni dans la question montre l'implémentation de base d'une file d'attente de blocage. Cependant, il manque de mécanismes de synchronisation appropriés et peut entraîner des problèmes de sécurité des threads.

Méthode d'amélioration

Afin de résoudre les limites de l'implémentation d'origine, veuillez considérer la version améliorée suivante:

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>
Copier après la connexion
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()

Pour les applications réelles, il peut avoir besoin de faire face à la situation où la file d'attente est fermée ou le besoin d'élégance est nécessaire. Pour cette raison, le code peut être modifié comme suit (comme indiqué ci-dessus).

Ces fonctions améliorées permettent le thread de lecture de manière ordonnée lorsque la file d'attente est fermée. Le code amélioré augmente la vérification de la fermeture des files d'attente et traite la situation de la fermeture de la file d'attente et vide, évitant les anomalies.

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!

source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal