gpt4 book ai didi

c# - 这个 StaticRandom 类是线程安全的吗?

转载 作者:太空宇宙 更新时间:2023-11-03 22:46:24 24 4
gpt4 key购买 nike

我正在编写的程序是一个游戏服务器,它将在单独的线程中有多个 session 。为了避免不必要的锁等待时间,添加了[ThreadStatic]

该程序将包含一些异步函数和ThreadSafeStaticRNG(此类)将在异步中使用。

public class ThreadSafeStaticRNG 
{
[ThreadStatic]
static Random r = new Random();

/// <summary>
/// get random number from [min,max)
/// </summary>
/// <returns></returns>
public static int GetNext(int min, int max)
{
int n;
lock (r)
{
n = r.Next(min, max);
}
return n;
}
}

我需要验证;

  1. 据我了解,使用 async/Task 创建的工作线程不会有单独的 ThreadStatic 实例。所以锁是必要的。
  2. 如果以上为真,lock中唯一的限制是await不能在lock中使用。所以在async function中使用lock是安全的。
  3. (edit) lock (r) for r 实例,可以吗?官方文档和我看的其他代码只为lock创建了其他object

最佳答案

显示的代码(过度)线程安全且不正确(可以生成相同/同步的随机值)。

ThreadStatic保证每个线程(手动创建或从线程池中获取)都有自己的变量实例。因此,只要您不在外部公开该变量(如您的代码所示),您就不需要锁定

每个线程在每个时刻只能运行一个函数——无论它是 async 方法的一部分还是传递给线程的函数。线程不会在执行过程中在函数之间切换,因此不可能在同一个线程上同时并行调用 GetNext 的两次调用。

请注意,快速创建多个 Random 对象会导致 Random number generator only generating one random number - 检查这个特别的 answer用于正确初始化此类每线程实例 Random(使用增量种子)。

关于c# - 这个 StaticRandom 类是线程安全的吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49704517/

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