Memastikan Keselamatan Benang dengan Penjana Nombor Rawak C#
Kaedah Random.Next()
terbina dalam C# tidak selamat untuk benang. Menggunakannya dalam aplikasi berbilang benang boleh membawa kepada keputusan yang salah disebabkan oleh keadaan perlumbaan. Nasib baik, mencipta versi selamat benang adalah mudah.
Penjana Nombor Rawak Selamat Benang
Kelas ThreadSafeRandom
berikut menyediakan penyelesaian menggunakan pembolehubah statik benang untuk menjamin keselamatan benang. Setiap urutan mendapat contoh Random
bebasnya sendiri.
<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>
Pengurusan Benih untuk Nombor Rawak Unik
Masalah biasa dengan berbilang Random
kejadian ialah menjana nombor yang serupa atau serupa, terutamanya apabila dibuat secara berturut-turut. Pelaksanaan ini menangani perkara ini dengan menggunakan contoh Random
global (_global
) untuk menjana benih unik bagi setiap contoh Random
benang-tempatan (_local
). Pernyataan lock
menghalang keadaan perlumbaan apabila mengakses Random
global untuk penjanaan benih.
Kaedah ini memastikan benih yang berbeza untuk setiap utas, menghasilkan urutan nombor yang benar-benar rawak dan bebas. Pembangun kini boleh menggunakan penjanaan nombor rawak dengan selamat dalam aplikasi berbilang benang, mengelakkan perangkap pendekatan tidak selamat benang.
Atas ialah kandungan terperinci Bagaimanakah Saya Boleh Mencipta Penjana Nombor Rawak Selamat Benang dalam C#?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!