Rumah > pembangunan bahagian belakang > C++ > Bagaimana untuk mengendalikan 'koleksi telah diubah suai; operasi penghitungan tidak boleh melaksanakan' kesilapan dalam persekitaran multithreaded?

Bagaimana untuk mengendalikan 'koleksi telah diubah suai; operasi penghitungan tidak boleh melaksanakan' kesilapan dalam persekitaran multithreaded?

DDD
Lepaskan: 2025-02-02 03:46:10
asal
418 orang telah melayarinya

How to Handle

Mengalami "Koleksi Modified: Operasi Penghitungan Mungkin Gagal" Kesalahan

Koleksi ralat "telah diubah suai; operasi penghitungan tidak boleh dilaksanakan" timbul apabila koleksi diubah semasa diulang, yang membawa kepada tingkah laku yang tidak dapat diramalkan. Ini biasanya berlaku dalam senario multithreaded di mana pelbagai benang mengakses dan mengubahsuai koleksi yang sama serentak.

Ralat khusus ini ditunjukkan dalam kaedah

, di mana kamus NotifySubscribers() diakses dalam gelung subscribers. Pengubahsuaian serentak ke kamus ini (mis., Langganan klien atau tidak langganan) Membatalkan penghitungan. foreach

Penyelesaian: Melaksanakan Keselamatan Thread

Untuk menyelesaikannya, keselamatan benang untuk kamus

adalah penting. Dua pendekatan disyorkan: subscribers

  1. Menggunakan : ConcurrentDictionary Gantikan kamus standard dengan . Struktur data ini sememangnya selamat benang, menghalang kesilapan. ConcurrentDictionary<TKey, TValue>

  2. Mewujudkan salinan untuk lelaran: Sebelum gelung , buat salinan nilai kamus foreach menggunakan subscribers. Ini mewujudkan gambar yang tidak terjejas oleh pengubahsuaian berikutnya kepada kamus asal, memastikan penghitungan yang selamat. subscribers.Values.ToList()

Contoh kod:

inilah kaedah

yang diubahsuai untuk menggunakan NotifySubscribers(): ConcurrentDictionary

<code class="language-csharp">public void NotifySubscribers(DataRecord sr)
{
    foreach (Subscriber s in subscribers.Values) // subscribers is now a ConcurrentDictionary
    {
        try
        {
            s.Callback.SignalData(sr);
        }
        catch (Exception e)
        {
            DCS.WriteToApplicationLog(e.Message, System.Diagnostics.EventLogEntryType.Error);
            UnsubscribeEvent(s.ClientId);
        }
    }
}</code>
Salin selepas log masuk
dan inilah versi menggunakan

untuk membuat salinan selamat: ToList()

<code class="language-csharp">public void NotifySubscribers(DataRecord sr)
{
    foreach (Subscriber s in subscribers.Values.ToList())
    {
        try
        {
            s.Callback.SignalData(sr);
        }
        catch (Exception e)
        {
            DCS.WriteToApplicationLog(e.Message, System.Diagnostics.EventLogEntryType.Error);
            UnsubscribeEvent(s.ClientId);
        }
    }
}</code>
Salin selepas log masuk
Dengan melaksanakan salah satu daripada penyelesaian ini, anda memastikan keselamatan benang dan mencegah ralat "Koleksi diubahsuai ...", yang membawa kepada kod yang lebih mantap dan boleh dipercayai.

Atas ialah kandungan terperinci Bagaimana untuk mengendalikan 'koleksi telah diubah suai; operasi penghitungan tidak boleh melaksanakan' kesilapan dalam persekitaran multithreaded?. 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