gpt4 book ai didi

c++ - 发布配置中多线程的 Visual Studio C++ 运行时问题

转载 作者:太空宇宙 更新时间:2023-11-04 15:34:04 24 4
gpt4 key购买 nike

当我将配置设置为发布(对于 x86 和 x64)进行编译时,我的程序无法完成。澄清一下,没有构建错误或执行错误。

在查找问题的原因和解决方案后,我找到了 Program only crashes as release build -- how to debug?这表明这是一个数组问题。虽然这解决了我的问题,但它让我对此事有了一些了解(我留在这里留给下一个人)。

更复杂的是,只有当主线程上的子程序的执行时间大于大约 0 毫秒时。

以下是代码的相关部分:

//  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);

我的程序卡住的违规行是最后一条语句,程序在其中等待创建的线程终止:

WaitForSingleObject(progressBarHandle, INFINITE);

下面是进度条函数的代码:

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;
}

如果被测子程序的执行时间约为 0 毫秒,“核心”while 循环通常不会进行单次迭代。澄清一下,如果定时子程序的执行时间是0ms左右,那么在printProgressBar执行一次之前nPC_Current会大于nPC_Max。这意味着该线程将在主线程开始等待它之前终止。

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

谢谢!

编辑:

  • 措辞
  • 删除分散注意力的内容并添加说明

最佳答案

我的猜测是您忘记声明您的共享全局变量 volatile (特别是 nPC_Current)。由于线程函数本身从不修改 nPC_Current ,在代码的发布版本中,编译器将您的进度条循​​环优化为一个无限循环,其值永远不会更改 nPC_Current .

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

附言此外,看来您最初打算通过您的 nPC_Current与作为线程参数的线程函数相反(根据您的 CreateThread 调用判断)。但是,在线程函数中您忽略参数并访问 nPC_Current直接作为全局变量。坚持将它作为线程参数传递和访问的最初想法可能是一个更好的主意。

关于c++ - 发布配置中多线程的 Visual Studio C++ 运行时问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39801458/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com