Tyr*_*nne 1 c# multithreading thread-safety
我正在阅读一本关于C#的书,当时声明下面的代码声称下面的代码将为共享计数变量产生20000个增量,而最终的count值将是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);
}
Run Code Online (Sandbox Code Playgroud)
它实际上并没有使它安全,你只是影响时间减少了看到效果的几率.执行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);
}
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
98 次 |
| 最近记录: |