C#/ VS2013 - 为什么这段代码没有调试就失败了?

时间:2014-11-02 01:36:46

标签: c# multithreading visual-studio debugging

这是我编写的用于测试基本线程场景的程序。当我在启用调试的情况下运行它时,它完全按预期工作。

using System;
using System.Threading;

class Program
{
    static bool keepCounting;

    static void Main(string[] args)
    {
        Thread myThread = new Thread(countNumbers);
        myThread.Name = "MyThread";

        keepCounting = true;
        myThread.Start();
        Thread.Sleep(new TimeSpan(0, 0, 1)); // countNumbers() runs for 1 sec.
        keepCounting = false;
    }

    static void countNumbers()
    {
        Console.WriteLine("{0} beginning count.", Thread.CurrentThread.Name);
        long n = 0;
        while (keepCounting)
        {
            n++;
        }
        Console.WriteLine("Current thread:          {0}", Thread.CurrentThread.Name);
        Console.WriteLine("Number of iterations:    {0}", n);
    }
}

然而,当我设置VS进行发布构建,并使用“Start Without Debugging”运行它时 - 请注意,必须采取这些步骤,否则它仍然会成功 - 它会神秘地“卡住” “在打印”MyThread开始计数后“countNumbers()方法中间某处,它永远不会超时并将结果打印到控制台窗口。

任何人都可以解释这种古怪的行为吗?

1 个答案:

答案 0 :(得分:3)

你的循环

while (keepCounting)
{
    n++;
}

就语言而言,是等同于

var cpu_register = keepCounting;
while (cpu_register)
{
    n++;
}

CPU寄存器比内存读取快得多,因此优化器使用第二个版本。可预测的不愉快结果。