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
Lepaskan: 2025-01-21 02:35:09
asal
821 orang telah melayarinya

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>
Salin selepas log masuk

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!

sumber:php.cn
Kenyataan Laman Web ini
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
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan