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

Adakah Kaedah C#'s Random.Next() Thread-Safe, dan Bagaimana Saya Boleh Membuatnya Begitu?

Patricia Arquette
Patricia Arquetteasal
2025-01-21 02:37:07505semak imbas

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

Keselamatan benang kaedah C# Random.Next()

Kaedah

C#'s Random.Next() tidak selamat untuk benang. Menggunakan contoh Random yang sama daripada berbilang urutan boleh mengakibatkan tingkah laku yang tidak dapat diramalkan, atau malah mengembalikan hasil semua 0.

Penyelesaian

Untuk mencipta versi selamat untuk benang Random kita boleh mencipta kejadian setempat untuk setiap urutan. Kod berikut menunjukkan ini:

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

Kelas ini mengekalkan pembolehubah Random statik yang berasingan (_local) untuk setiap urutan. Untuk mengelakkan percanggahan antara tika yang dibuat pada masa yang sama, gunakan tika Random statik global (_global) untuk benih kejadian setempat-benang.

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