Isu keselamatan benang dalam penjana nombor rawak C#
Dalam pembangunan perisian, memastikan akses selamat kepada sumber yang dikongsi dalam persekitaran berbilang benang adalah penting. Kaedah Random.Next()
C# digunakan untuk menjana nombor rawak, tetapi keselamatan benangnya patut diterokai.
Random.Next()
selamat untuk urutan?
Tidak. Jika berbilang urutan menggunakan contoh Random.Next()
yang sama pada masa yang sama, ini boleh membawa kepada tingkah laku yang tidak dapat diramalkan dan mungkin juga siri nilai sifar.
Buat penjana nombor rawak selamat benang
Untuk mencipta versi kelas Random
selamat benang, pendekatan berikut disyorkan:
<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>
Cara ia berfungsi:
Kelas ini mencapai keselamatan benang dengan mengekalkan tika Random
statik unik untuk setiap urutan. Apabila urutan baharu mengakses kelas ini, ia menjana nilai benih daripada contoh Random
global, memastikan urutan itu unik bagi setiap utas.
Menyelesaikan Random
isu kecil
Random
juga mempunyai ciri: jika berbilang tika dibuat dalam tempoh masa yang singkat (dalam masa 15 milisaat), mereka mungkin mengembalikan jujukan yang sama. Untuk mengurangkan masalah ini, gunakan contoh Random
global untuk menjana benih bagi mengelakkan konflik.
Kesimpulan:
Memahami had keselamatan benang C# Random.Next()
dan melaksanakan versi selamat benang boleh memastikan penjanaan nombor rawak yang boleh dipercayai dalam aplikasi berbilang benang.
Atas ialah kandungan terperinci Adakah C#'s Random.Next() Thread-Safe, dan Bagaimana Anda Boleh Mencipta Alternatif Thread-Safe?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!