C# 随机数生成器线程安全吗?

2024-02-15

Is C#'s Random.Next() https://learn.microsoft.com/en-us/dotnet/api/system.random.next#overloads方法线程安全吗?


不,从多个线程使用同一个实例可能会导致它中断并返回全 0。但是,创建一个线程安全版本(不需要在每次调用时使用令人讨厌的锁)Next())很简单。改编自中的想法本文 http://web.archive.org/web/20160326010328/http://blogs.msdn.com/b/pfxteam/archive/2009/02/19/9434171.aspx:

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();
    }
}

这个想法是保持一个单独的static Random每个线程的变量。然而,由于另一个问题,以明显的方式做到这一点失败了Random- 如果几乎同时创建多个实例(约15ms以内),它们都会返回相同的值!为了解决这个问题,我们创建了一个全局静态的Random实例来生成每个线程使用的种子。

顺便说一下,上面的文章有代码演示了这两个问题Random.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C# 随机数生成器线程安全吗? 的相关文章

随机推荐