Jaminan keselamatan benang dalam penjanaan nombor rawak C#
Dalam aplikasi berbilang benang, adalah penting untuk memastikan sumber atau kaedah kritikal selamat untuk benang. Dalam C#, keselamatan benang kaedah Random.Next()
alat penjanaan nombor rawak yang biasa digunakan adalah membimbangkan.
Adakah benang penjana nombor rawak C# selamat?
Tidak, penggunaan serentak Random.Next()
daripada berbilang rangkaian pada masa yang sama tidak selamat untuk rangkaian. Ini boleh membawa kepada tingkah laku yang tidak dapat diramalkan dan mungkin keputusan yang salah. Punca masalah ialah berbilang urutan mungkin cuba mengubah suai keadaan dalaman contoh Random
yang sama pada masa yang sama, menyebabkan nilai menjadi rosak atau gagal sepenuhnya, hanya mengembalikan 0.
Buat penjana nombor rawak selamat benang
Walaupun Random.Next()
sendiri tidak selamat untuk benang, adalah mungkin untuk mencipta versi selamat benang tanpa menggunakan mekanisme penguncian yang kompleks untuk setiap panggilan kaedah. Dengan memanfaatkan teknik yang diterangkan dalam artikel luaran, kami boleh melaksanakan kelas ThreadSafeRandom
tersuai:
<code class="language-csharp">public class ThreadSafeRandom { private static readonly Random _global = new Random(); [ThreadStatic] private static Random _local; public int Next() { if (_local == null) { int seed; lock (_global) { seed = _global.Next(); } _local = new Random(seed); } return _local.Next(); } }</code>
Penjelasan
KelasThreadSafeRandom
memastikan keselamatan rangkaian dengan mengekalkan contoh Random
yang berasingan untuk setiap urutan. Ini menghalang benang daripada mengganggu keadaan dalaman satu sama lain. Walau bagaimanapun, terdapat kaveat: mencipta berbilang kejadian Random
dalam jarak yang sangat dekat (dalam kira-kira 15 milisaat) boleh menghasilkan urutan nombor rawak yang sama. Untuk menyelesaikan masalah ini, kami memperkenalkan tika Random
statik global (_global
) yang digunakan untuk menjana nilai benih untuk tika Random
setempat setiap utas (_local
).
Atas ialah kandungan terperinci Adakah Kaedah `Random.Next()` C#'s Thread-Safe, dan Bagaimana Kami Boleh Mencipta Alternatif Thread-Safe?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!