Rumah > pembangunan bahagian belakang > C++ > Adakah C#'s Random.Next() Thread-Selamat, dan Bagaimana Kita Boleh Membuatnya?

Adakah C#'s Random.Next() Thread-Selamat, dan Bagaimana Kita Boleh Membuatnya?

Barbara Streisand
Lepaskan: 2025-01-21 02:46:13
asal
190 orang telah melayarinya

Is C#'s Random.Next() Thread-Safe, and How Can We Make It So?

Keselamatan benang penjana nombor rawak C#

Adakah kaedah

dalam C# thread-safe dan membenarkan berbilang thread digunakan secara serentak? Jawapannya malangnya tidak. Menggunakan contoh yang sama dalam berbilang urutan boleh mengakibatkan kerosakan data, ditunjukkan dengan mengembalikan 0s berturut-turut. Random.Next()

Nasib baik, adalah mungkin untuk mencipta varian selamat benang tanpa menggunakan kunci yang menyusahkan pada setiap

panggilan. Berdasarkan konsep yang dibentangkan dalam artikel yang mencerahkan, kami menawarkan penyelesaian: Next()

<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
Inti pendekatan ini adalah untuk mengekalkan contoh

statik yang berasingan untuk setiap urutan. Tetapi walaupun pelaksanaan mudah ini menghadapi perangkap lain. Apabila berbilang kejadian dimulakan dalam tempoh masa yang singkat (sekitar 15 milisaat), ia lalai kepada jujukan yang sama. Untuk menyelesaikan masalah ini, kami memperkenalkan contoh Random statik global yang digunakan khusus untuk menjana benih bagi setiap utas. Random

Artikel yang dinyatakan di atas menyediakan kod ilustrasi yang memperincikan kedua-dua pertimbangan ini dan memberikan panduan mendalam tentang selok-belok

dalam C#. Random

Atas ialah kandungan terperinci Adakah C#'s Random.Next() Thread-Selamat, dan Bagaimana Kita Boleh Membuatnya?. 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