我尝试运行一个使用ThreadStatic属性的代码,由于某种原因,显示了不同的结果。
[ThreadStatic]
public static int _field;
public static void Main(string[] args)
{
new Thread(() =>
{
for(int x = 0; x < 10; x++)
{
_field++;
Console.WriteLine("Thread A: {0}", _field);
}
}).Start();
new Thread(() =>
{
for(int x = 0; x < 10; x++)
{
_field++;
Console.WriteLine("Thread B: {0}", _field);
}
}).Start();
Console.ReadKey();
}结果1:

结果2:

有人能解释一下为什么吗?谢谢!
发布于 2016-07-13 19:54:02
当您在多个线程上执行代码时,执行的顺序变得有些不可预测。你可能一遍又一遍地得到完全相同的结果,但它会做一些不同的事情。
这种不一致的行为是可以的,只要你不依赖于一致的行为。把它想象成两个人在画一座建筑--一个从后面开始,一个从前面开始,因为它速度更快,而且一个先完成另一个并不重要。
这个DotNetFiddle演示了。它将一串连续的数字放入一个ConcurrentQueue中,然后使用多个线程将其先入先出移到另一个队列中。您可能会期望它们总是以相同的顺序到达第二个队列,而且通常是这样的。但偶尔他们不知道。
意识到这种行为是非常重要的。否则,我们可以编写多线程代码,我们测试它,它似乎是以一种方式工作,然后,我们得到不可预测的结果,偶尔发生,但我们不知道为什么,我们不能重复,当调试。如果发生这种情况,那么问题就很难找到了。但这只是一个问题,如果我们依赖的行为是不可预测的。
发布于 2016-07-13 17:55:58
因为您无法控制线程何时获得CPU时间间隔的时间。所以每次运行的顺序都是不同的。
https://stackoverflow.com/questions/38358589
复制相似问题