为什么调试和发布模式下的线程执行顺序不同?

时间:2013-02-22 18:14:14

标签: c# multithreading visual-studio debugging release

我在Visual Studio 2010,Windows XP SP3中运行下面的C#代码。

在“无需调试开始”(按Ctrl + F5或从菜单中),输出:

  • 主要您好 工人你好

“从调试开始”(通过F5或菜单)显示相反的顺序:

  • 工作人员你好 你好主要

多次检查。它具有可重复性和可重复性 为什么?

using System;
using System.Threading;

namespace _5NamingThreads
{
  class ThreadNaming
  {
    static void Main()
    {
      Thread.CurrentThread.Name = "main";
      Thread worker = new Thread(Go);
      worker.Name = "worker";
      worker.Start();
      Go();
      Console.ReadLine();
    }

    static void Go()
    {
      Console.WriteLine("Hello from " + Thread.CurrentThread.Name);
    }
  }
}

更新
第二天,重新启动计算机之后,我总是会观察在所有模式下发布和调试都具有相当可重现性的顺序:

  • 主要您好 工人你好

后续问题:
While debugging, is it possible to ensure the output without stepping into each line of code?

2 个答案:

答案 0 :(得分:5)

在调试模式下,线程启动过程需要在新线程中初始化调试上下文。这必须在函数返回之前完成,因为原始线程可能在新线程上运行。最终结果是原始线程减慢到足以让新线程先运行。

当然,这不是永远依赖的东西。它可能会在下一版本的操作系统,库,调试器,CPU ......中发生变化。

答案 1 :(得分:3)

这是因为启动新的异步线程是不确定的。换句话说,开发人员不能依赖线程以相同的顺序执行。见race conditions.