为什么当Console.WriteLine在下一行时,i ++就像线程安全操作一样

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)

Pau*_*aul 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);
    }
}
Run Code Online (Sandbox Code Playgroud)