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.这意味着线程将在主线程开始等待之前终止.
如果有人愿意帮助解决这个问题,或者就此事提供一些进一步的见解,那就太棒了,因为我在解决这个问题时遇到了一些麻烦.
谢谢!
编辑:
我的猜测是你忘了声明共享的全局变量volatile(nPC_Current具体而言).由于线程函数本身永远不会修改nPC_Current,因此在代码的发行版本中,编译器优化了进度条循环到无限循环,从不改变值nPC_Current.
这就是为什么您的进度条永远不会从0%代码的发行版本中更新的原因,这就是您的进度条线程永远不会终止的原因.
PS此外,您最初打算将nPC_Current计数器作为线程参数传递给线程函数(通过CreateThread调用判断).但是,在线程函数中,您忽略参数并nPC_Current直接作为全局变量访问.坚持传递和访问它作为线程参数的原始想法可能是一个更好的主意.
| 归档时间: |
|
| 查看次数: |
101 次 |
| 最近记录: |