私は C++0x のサポートを試していますが、あるべきではないと思われる問題があります。主題が理解できないか、gcc にバグがあります。
最初は次のコードがx
あり、y
等しいです。スレッド 1 は常にx
最初にインクリメントし、次にインクリメントしますy
。どちらもアトミックな整数値なので、インクリメントはまったく問題ありません。スレッド 2 はx
がより小さいかどうかをチェックy
し、そうであればエラー メッセージを表示します。
このコードは時々失敗しますが、なぜですか? ここでの問題はおそらくメモリの並べ替えですが、すべてのアトミック操作はデフォルトで順次一貫しており、これらの操作を明示的に緩和しませんでした。このコードを x86 でコンパイルしていますが、私が知る限り、順序付けの問題はありません。何が問題なのか説明してもらえますか?
#include <iostream>
#include <atomic>
#include <thread>
std::atomic_int x;
std::atomic_int y;
void f1()
{
while (true)
{
++x;
++y;
}
}
void f2()
{
while (true)
{
if (x < y)
{
std::cout << "error" << std::endl;
}
}
}
int main()
{
x = 0;
y = 0;
std::thread t1(f1);
std::thread t2(f2);
t1.join();
t2.join();
}
結果はこちらでご覧いただけます。