Home > Backend Development > C++ > How to Implement a Thread-Safe Blocking Queue in .NET?

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

DDD
Release: 2025-01-30 04:41:41
Original
847 people have browsed it

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

Building a Thread-Safe Blocking Queue in .NET

Multithreaded applications often require a shared queue where multiple threads add and retrieve items concurrently. A blocking queue is ideal for this, pausing adding threads when the queue is full and pausing removing threads when the queue is empty.

A Robust Blocking Queue Solution

The following improved implementation addresses potential race conditions using Monitor for synchronization and offers a graceful closure mechanism:

SizeQueue<T> Implementation

This example utilizes a synchronized Queue<T> and Monitor for efficient thread blocking and unblocking:

<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>
Copy after login

This enhanced SizeQueue<T> provides a thread-safe, blocking queue with a Close() method for controlled shutdown, preventing deadlocks and ensuring graceful termination of consuming threads. The TryDequeue method allows for checking the queue's state before attempting to dequeue.

The above is the detailed content of How to Implement a Thread-Safe Blocking Queue in .NET?. For more information, please follow other related articles on the PHP Chinese website!

source:php.cn
Statement of this Website
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn
Popular Tutorials
More>
Latest Downloads
More>
Web Effects
Website Source Code
Website Materials
Front End Template