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

时间:2014-03-28 10:48:27

标签: c# multithreading thread-safety

我正在阅读一本关于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);
    }

1 个答案:

答案 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);
    }
}