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

Adakah foreach Loop Thread-Selamat Apabila Digunakan dengan Penutupan?

DDD
Lepaskan: 2025-01-22 07:01:08
asal
338 orang telah melayarinya

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:

foreach (Foo f in ListOfFoo)
{
    Thread thread = new Thread(() => f.DoSomething());
    threads.Add(thread);
    thread.Start();
}
Salin selepas log masuk

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:

foreach (Foo f in ListOfFoo)
{
    Foo f2 = f;
    Thread thread = new Thread(() => f2.DoSomething());
    threads.Add(thread);
    thread.Start();
}
Salin selepas log masuk

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