我尝试运行使用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:
任何人都可以向我解释原因吗?谢谢!
答案 0 :(得分:1)
当您在多个线程上执行代码时,执行顺序变得有些不可预测。你可能反复得到完全相同的结果,但它会做一些不同的事情。
只要您不依赖于一致的行为,这种不一致的行为就可以了。可以想象它就像两个人在画一个建筑物 - 一个从后面开始,一个从前面开始,因为它更快,因为一个人在另一个之前完成并不重要。
这DotNetFiddle证明了这一点。它将一堆连续的数字放在ConcurrentQueue
中,然后使用多个线程将它们先进先出地移动到另一个队列中。您可能希望它们总是以相同的顺序到达第二个队列,而且通常是这样。但偶尔他们不会。
了解这种行为非常重要。否则我们可以编写多线程代码,我们测试它并且它似乎以一种方式工作,然后我们得到偶尔发生的不可预测的结果但我们无法弄清楚原因,我们不能重复它调试。如果发生这种情况,那么很难找到问题。但如果我们依赖于不可预测的行为,这只是一个问题。
答案 1 :(得分:0)
因为您无法控制线程何时获得CPU时间片。因此每次运行的顺序都不同。