Rumah > pembangunan bahagian belakang > C++ > Bagaimana untuk merancang barisan menghalang benang di .net?

Bagaimana untuk merancang barisan menghalang benang di .net?

DDD
Lepaskan: 2025-01-30 04:51:12
asal
214 orang telah melayarinya

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

Bina barisan penyekatan keselamatan benang dalam .net

Dalam persekitaran multi -threaded, apabila pelbagai benang mengendalikan barisan yang sama, pengurusan barisan efisien adalah penting. Artikel ini membincangkan cara membuat giliran menyekat dalam .NET untuk memenuhi permintaan ini.

batasan pelaksanaan sedia ada

Serpihan kod yang disediakan dalam soalan menunjukkan pelaksanaan asas giliran menyekat. Walau bagaimanapun, ia tidak mempunyai mekanisme penyegerakan yang sesuai dan boleh membawa kepada isu keselamatan benang.

kaedah penambahbaikan

Untuk menyelesaikan batasan pelaksanaan asal, sila pertimbangkan versi yang lebih baik berikut:

Dalam versi yang lebih baik ini, operasi giliran perlindungan
<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>
Salin selepas log masuk
untuk memastikan keselamatan benang. Kelas

digunakan untuk menyekat dan mengangkat benang menyekat mengikut status barisan. Di samping itu, kaedah dan lock ditambah kepada penutupan elegan barisan, dan kaedah Monitor digunakan untuk mengendalikan barisan sebagai kosong. closing Close() Pertimbangan lanjut TryDequeue()

Untuk aplikasi sebenar, ia mungkin perlu menangani keadaan di mana barisan ditutup atau keperluan untuk keanggunan diperlukan. Atas sebab ini, kod itu boleh diubahsuai seperti berikut (seperti yang ditunjukkan di atas).

Fungsi yang dipertingkatkan ini membolehkan benang bacaan dengan cara yang teratur apabila barisan ditutup. Kod yang lebih baik meningkatkan pemeriksaan penutupan giliran, dan memproses keadaan penutupan barisan dan kosong, mengelakkan keabnormalan.

Atas ialah kandungan terperinci Bagaimana untuk merancang barisan menghalang benang di .net?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

sumber:php.cn
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan