有一个函数可在2秒后将值“bIsTrue”更改为true。
当bIsTrue为“true”时,主线程可以在循环时转义并打印出“现在bIsTrue为True!”。在main()中
#include <iostream>
#include <process.h>
#include <Windows.h>
using namespace std;
bool bIsTrue; // global variable
unsigned __stdcall Func(void* pArg)
{
Sleep(2000);
bIsTrue = true;
return 0;
}
这是main()。但是当while循环中没有任何内容时,
主线程不打印“Now bIsTrue is True!”在 Release模式下。
int main()
{
// bIsTrue will be "true" after 2sec.
bIsTrue = false;
HANDLE tHandle = (HANDLE)_beginthreadex(NULL, 0, Func, NULL, 0, NULL);
CloseHandle(tHandle);
size_t i = 0;
while (!bIsTrue)
{
// If here is a nothing, main thread can't escape this loop in Release mode.
// but can escape in Debug mode.
// When here is Sleep() or cout, main thread can escape this loop in both mode.
// Sleep(1000);
// OR
// cout << i++ << endl;
}
cout << "Now bIsTrue is True!" << endl;
return 0;
}
这是在循环中打印“i”时的结果。enter image description here
你们能理解为什么我得到这个结果吗?
最佳答案
可能正在发生的事情是您的标志变量正在由编译器优化,因为它认为它不能更改。在这种情况下,您可以使用volatile
,也可以使用std::atomic
:
volatile std::atomic<bool> bIsTrue = false;
另外,我将检查您对WinAPI函数的使用。我建议改用标准的C++线程库:https://en.cppreference.com/w/cpp/header/thread。