gpt4 book ai didi

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

转载 作者:IT王子 更新时间:2023-10-29 03:43:22 31 4
gpt4 key购买 nike

是 C# 的 Random.Next()方法线程安全吗?

最佳答案

不,从多个线程使用同一个实例会导致它中断并返回全 0。然而,创建一个线程安全的版本(不需要在每次调用 Next() 时都使用讨厌的锁)很简单。改编自 this article 中的想法:

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 的另一个问题 - 如果几乎同时创建多个实例(在大约 15 毫秒内),它们将全部返回相同的值!为了解决这个问题,我们创建了一个全局静态的 Random 实例来生成每个线程使用的种子。

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

关于c# - C# 随机数生成器线程安全吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3049467/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com