C#/VS2013-为什么此代码在未调试的情况下失败

本文关键字:调试 情况下 失败 代码 VS2013- 为什么 | 更新日期: 2023-09-27 18:28:55

下面是我为测试基本线程场景而编写的一个程序。当我在启用调试的情况下运行它时,它的工作方式与预期完全一样。

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 starting count."后,它神秘地被"卡"在countNumbers()方法中间的某个位置,并且它从未超时并将结果打印到控制台窗口。

有人能解释这种怪癖吗?

C#/VS2013-为什么此代码在未调试的情况下失败

您的循环

while (keepCounting)
{
    n++;
}

就语言而言,相当于

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

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