Rumah >pembangunan bahagian belakang >C++ >Adakah foreach Loop Thread-Selamat Apabila Digunakan dengan Penutupan?
foreach
Keselamatan 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!