有一个函数可在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

10-05 23:34