0

我在 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);
    }
  }
}

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

  • 来自主要
    的你好 来自工人的你好

追问:
在调试的时候,不单步进入每一行代码,是否可以保证输出?

4

2 回答 2

5

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

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

于 2013-02-22T18:16:02.443 回答
3

这是因为启动新的异步线程是不确定的。换句话说,开发人员不能依赖线程以相同的顺序执行。查看比赛条件。

于 2013-02-22T18:18:19.933 回答