- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我正在编写的程序是一个游戏服务器,它将在单独的线程中有多个 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;
}
}
我需要验证;
async
/Task
创建的工作线程不会有单独的 ThreadStatic
实例。所以锁是必要的。lock
中唯一的限制是await
不能在lock
中使用。所以在async function
中使用lock
是安全的。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/
我正在编写的程序是一个游戏服务器,它将在单独的线程中有多个 session 。为了避免不必要的锁等待时间,添加了[ThreadStatic]。 该程序将包含一些异步函数和ThreadSafeStati
我正在开发一个 C# 项目,该项目需要在 parallel.for 循环中使用随机数。为此,我使用了 Jon Skeet 的 MiscUtil 中的 StaticRandom 类。 对于测试,我希望能
我是一名优秀的程序员,十分优秀!