在发布配置上使用多线程的Visual Studio C++运行时问题

Zac*_*ary 0 c++ multithreading visual-studio-2015

当我使用配置设置为release(对于x86和x64)进行编译时,我的程序无法完成.为了澄清,没有构建错误或执行错误.

在寻找问题的原因和解决方案之后,我发现程序只会崩溃作为发布版本 - 如何调试?这提出它是一个数组问题.虽然这解决了我的问题,但它给了我一些关于此事的见解(我将这里留给下一个人).

为了进一步混淆,只有当主线程上的子程序的执行时间大于约0ms时才会出现问题.

以下是相关的代码部分:

//  Startup Progress Bar Thread
nPC_Current = 0; // global int
nPC_Max = nPC; // global int (max value nPC_Current will reach)

DWORD myThreadID;
HANDLE progressBarHandle = CreateThread(0, 0, printProgress, &nPC_Current, 0, &myThreadID);

/* Do stuff and time how long it takes (this is what increments nPC_Current) */

//  Wait for Progress Bar Thread to Terminate
WaitForSingleObject(progressBarHandle, INFINITE);
Run Code Online (Sandbox Code Playgroud)

我的程序卡在上面的违规行是最后一个语句,程序等待创建的线程终止:

WaitForSingleObject(progressBarHandle, INFINITE);
Run Code Online (Sandbox Code Playgroud)

以下是进度条功能的代码:

DWORD WINAPI printProgress(LPVOID lpParameter)
{   
    int lastProgressPercent = -1;   //  Only reprint bar when there is a change to display.

    //  Core Progress Bar Loop
    while (nPC_Current <= nPC_Max)
    {   
        // Do stuff to print a text progress bar
    }
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

如果测量子程序的执行时间约为0ms,那么'Core'while循环通常不会得到单次迭代.为了澄清这一点,如果定时子程序的执行时间约为0ms,则在printProgressBar执行一次之前,nPC_Current将大于nPC_Max.这意味着线程将在主线程开始等待之前终止.

如果有人愿意帮助解决这个问题,或者就此事提供一些进一步的见解,那就太棒了,因为我在解决这个问题时遇到了一些麻烦.

谢谢!

编辑:

  • 说法
  • 删除了令人分心的内容并添加了说明

AnT*_*AnT 6

我的猜测是你忘了声明共享的全局变量volatile(nPC_Current具体而言).由于线程函数本身永远不会修改nPC_Current,因此在代码的发行版本中,编译器优化了进度条循环到无限循环,从不改变值nPC_Current.

这就是为什么您的进度条永远不会从0%代码的发行版本中更新的原因,这就是您的进度条线程永远不会终止的原因.

PS此外,您最初打算将nPC_Current计数器作为线程参数传递给线程函数(通过CreateThread调用判断).但是,在线程函数中,您忽略参数并nPC_Current直接作为全局变量访问.坚持传递和访问它作为线程参数的原始想法可能是一个更好的主意.