我正在阅读一本关于C#的书,当时声明下面的代码声称以下代码将为共享计数变量生成20000个增量,而计数的最终值将会是20000。 当我运行它时,ii总是打印20000.据我记得,count ++不是线程安全的操作,当删除Console.WriteLine时,打印结果是预期的 - 在所有情况下都不是20000。 有人可以解释为什么在这种情况下,count有20000作为最终值。以及为什么count ++充当线程安全操作。
private static void testTask()
{
Task t1 = new Task(() =>
{
for (int i = 0; i < 10000; i++)
{
count++;
Console.WriteLine("Thread 1 - {0}", count);
}
}
);
Task t2 = new Task(() =>
{
for (int i = 0; i < 10000; i++)
{
count++;
Console.WriteLine("Thread 2 - {0}", count);
}
}
);
t1.Start();
t2.Start();
Task.WaitAll(t1, t2);
Console.WriteLine("Count - {0}", count);
}
答案 0 :(得分:6)
实际上并没有让它安全,你只是在影响时间,降低了看到效果的几率。执行i++
只花费Console.Write
所花费的时间的一小部分,因此您增加了一个线程中i++
在另一个线程中Console.Write
期间执行的几率。运行足够多次,你可能会发现相同的行为。
class Program
{
static void Main(string[] args)
{
for (int i = 0; i < 100; i++)
{
testTask();
}
Console.Read();
}
private static void testTask()
{
int count = 0;
Task t1 = new Task(() =>
{
for (int i = 0; i < 10000; i++)
{
count++;
//Console.WriteLine("Thread 1 - {0}", count);
}
}
);
Task t2 = new Task(() =>
{
for (int i = 0; i < 10000; i++)
{
count++;
//Console.WriteLine("Thread 2 - {0}", count);
}
}
);
t1.Start();
t2.Start();
Task.WaitAll(t1, t2);
Console.WriteLine("Count - {0}", count);
}
}