Rumah >pembangunan bahagian belakang >C++ >Adakah foreach Loop Thread-Selamat Apabila Digunakan dengan Penutupan?

Adakah foreach Loop Thread-Selamat Apabila Digunakan dengan Penutupan?

DDD
DDDasal
2025-01-22 07:01:08315semak imbas

Is foreach Loop Thread-Safe When Used with Closures?

foreachKeselamatan benang gelung dan penutup

Memastikan keselamatan benang memerlukan pertimbangan yang teliti apabila menggunakan foreach gelung dan penutupan. Dalam senario yang anda huraikan, terdapat dua coretan kod yang berbeza dalam cara mereka mengendalikan rujukan kepada objek Foo dalam penutupan.

Serpihan pertama menghantar rujukan terus:

<code class="language-c#">foreach (Foo f in ListOfFoo)
{
    Thread thread = new Thread(() => f.DoSomething());
    threads.Add(thread);
    thread.Start();
}</code>

Pendekatan ini tidak selamat kerana rujukan f yang sama dikongsi oleh semua urutan. Ini bermakna bahawa urutan yang berbeza boleh mengakses dan mengubah suai objek Foo yang sama, yang membawa kepada tingkah laku yang tidak dapat diramalkan.

Untuk memastikan keselamatan benang, anda harus membuat salinan rujukan di dalam gelung, seperti yang ditunjukkan dalam coretan kedua:

<code class="language-c#">foreach (Foo f in ListOfFoo)
{
    Foo f2 = f;
    Thread thread = new Thread(() => f2.DoSomething());
    threads.Add(thread);
    thread.Start();
}</code>

Dengan mencipta pembolehubah f2 baharu di dalam gelung, setiap urutan mempunyai salinan rujukannya sendiri kepada objek Foo. Ini memastikan bahawa setiap rangkaian beroperasi pada objek unik, menghalang keadaan perlumbaan dan potensi rasuah data.

Nota: Isu ini bukan khusus untuk threading. Masalah yang sama timbul apabila menggunakan penutupan dalam operasi tak segerak atau pengendali acara, dan penjagaan khas diperlukan untuk mengelakkan tingkah laku yang tidak dijangka dan mengekalkan integriti data.

Atas ialah kandungan terperinci Adakah foreach Loop Thread-Selamat Apabila Digunakan dengan Penutupan?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
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