首頁 >後端開發 >C++ >C# 的 Random.Next() 是執行緒安全的嗎?

C# 的 Random.Next() 是執行緒安全的嗎?

Barbara Streisand
Barbara Streisand原創
2025-01-21 02:46:13265瀏覽

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

C#隨機數產生器的執行緒安全性

C#中的Random.Next()方法是否執行緒安全,允許多個執行緒並發使用?答案是不幸的,不是。在多個執行緒中使用同一個實例可能會導致資料損壞,表現為傳回連續的0。

幸運的是,無需對每次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>

這種方法的核心是為每個執行緒維護一個單獨的靜態Random實例。但即使是這個簡單的實作也面臨另一個陷阱。當多個實例在很短的時間內(大約15毫秒)初始化時,它們會預設為相同的序列。為了解決這個問題,我們引入一個全域靜態Random實例,專門用於為各個執行緒產生種子。

上面提到的文章提供了說明性代碼,詳細說明了這兩個考慮因素,並提供了關於C#中Random的複雜性的深入指導。

以上是C# 的 Random.Next() 是執行緒安全的嗎?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn