1
#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でコンパイルされました

4

1 に答える 1