There are three question about the code snippet below.
- When the macro(i.e.
NO_STUCK_WITH_OPTIMIZATION
) is not enabled, why this code snippet gets stuck when the optimization is enabled(i.e.-O1
,-O2
or-O3
) whereas the program works well if the optimization is not enabled? - And why the program no longer get stuck if
std::this_thread::sleep_for()
is added?
UPDATED:
3. If the is_run
is declared as volatile
(for details, see the code snippet), then the program would never get stuck on X86?
^^UPDATED ENDS^^
#include <functional>
#include <thread>
#include <iostream>
#include <chrono>
#include <atomic>
#ifdef NO_STUCK_WITH_OPTIMIZATION
using TYPE = std::atomic<int>;
#else
using TYPE = int; //The progrom gets stuck if the optimization is enabled.
#endif
int main()
{
TYPE is_run{1};
auto thread = std::thread([&is_run](){while(1==is_run){
//std::this_thread::sleep_for(std::chrono::milliseconds(10)); //If this line is added, the program is no longer gets stuck. Why?
}
std::cout << "thread game over" << std::endl;
});
std::this_thread::sleep_for(std::chrono::seconds(1));
is_run = 0;
thread.join();
}