Rumah >pembangunan bahagian belakang >C++ >Adakah Kaedah `Random.Next()` C#'s Thread-Safe, dan Bagaimana Kami Boleh Mencipta Alternatif Thread-Safe?

Adakah Kaedah `Random.Next()` C#'s Thread-Safe, dan Bagaimana Kami Boleh Mencipta Alternatif Thread-Safe?

Linda Hamilton
Linda Hamiltonasal
2025-01-21 02:35:09857semak imbas

Is C#'s `Random.Next()` Method Thread-Safe, and How Can We Create a Thread-Safe Alternative?

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

Kelas

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

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