【发布时间】:2018-04-07 06:19:48
【问题描述】:
我正在编写的程序是一个游戏服务器,它将在单独的线程中有多个会话。为了避免不必要的锁等待时间,添加了[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)用于r实例,可以吗?我查看的官方文档和其他代码仅为lock创建了其他object。
【问题讨论】:
-
@UweKeim 是的,我进行了研究,但没有明确回答两个问题。这就是为什么我说
I need verification,因为信息不是来自官方文件。 -
我的错,没看清楚你的问题,抱歉。
标签: c# multithreading asynchronous thread-safety