#include <iostream>
#include <thread>
int x = 0;
int y = 0;
void f()
{
std::cout <<"f called\n";
static int c = 0;
while(y == 0)
{
++c;
}
std::cout << "c=" << c << std::endl;
std::cout << "x=" << x << std::endl;
}
void g()
{
std::cout <<"g called\n";
x = 42;
y = 1;
}
int main()
{
std::thread t1(f);
std::thread t2(g);
t1.join();
t2.join();
return 0;
}
f は、フラグ y が他のスレッドから設定されたときに 'x=42' を出力することになっています (まあ、x=0 も出力しますが、ここでは問題ではありません)。
デバッグ モードで実行すると、期待どおりに動作します。
f called
g called
c=80213
x=42
しかし、リリース モードでは、2 番目のスレッドがフリーズしているように見え、プログラムは決して終了しません。
f called
g called
誰かが理由を説明してもらえますか?
PS。プログラムはmignw g++ 4.8.0でコンパイルされました