アップデート3:
「メモリ順序は、」何であるかを理解した後、私は問題は完全にコンパイラとは関係ありません知っています。
はい、私のCPUアーキテクチャはIntel x86でなので、どのようなコードを書いても、メモリの順序効果は決して発生しません。C++ 11原子::店舗と原子::負荷
更新2:
逆アセンブリコードを確認します。しかし、コードをどのように追加しても、x.storeは常にy.storeの前にあります。
問題は、CPUの代わりにコンパイラ(これらのコードの順序を変更しない)から来るはずです(私が考える限り)。
更新:私がコメントを読んだ後、私はCPUのマシンを借りているよう
、それはアルファは、ARMまたはPPCであるようです。
誰も私がこの種のマシンをどこで使うことができるか知っていますが、これは無料ではありませんか?
起源:
私は以下のコードをテストしています。
atomic<int> x(0);
atomic<int> y(0);
void thr1()
{
x.store(1,memory_order_relaxed);
y.store(1,memory_order_relaxed);
}
void thr2()
{
while(!y.load(memory_order_relaxed))
;
cout<<x.load(memory_order_relaxed)<<endl; //may 0 or 1
}
私は、出力は、私は常に1
を取得し、関係なく、私が試したどのくらいの時間、しかし0
ないかもしれません知っているがために、私のCPUのx86アーキテクチャで、このですか?
この問題を解決するにはどうすればよいですか?
(私はCppMemを知っていますが、ループは使用できません)
おそらくhttp://www.1024cores.net/home/relacy-race-detector/rrd-introductionを試してみてください。 –
ご注文が十分に緩和されたハードウェアをお持ちでない場合は、これを確認できない場合があります。これをDEC AlphaやPlaystationで実行できますか? –
これは何か違いがあるのかどうかはわかりませんが、両方の数字が同じページにある可能性が高いと思われます。たぶんあなたは別のページにそれらを置く場合、異なる結果が表示されます。 – 5gon12eder