Update 3 zu beachten:
Nach dem Verständnis, was „Gedächtnis Ordnung“ ist, ich weiß, das Problem absolut nicht zu Compiler verwendet ist.
Und ja, weil meine CPU-Architektur ist Intel x86, egal welchen Code ich schreibe, wird der Speicherreihenfolge Effekt nie passieren.C++ 11, wie Speicher, um in Atom :: Speicher und Atom :: load
Update 2:
Ich überprüfe den Disassembly-Code. Allerdings finde ich egal wie ich Code hinzufüge, der x.store immer vor y.store.
Das Problem sollte vom Compiler kommen (der diesen Code nicht neu anordnet) anstelle von CPU (soweit ich denke).
aktualisieren:
Nachdem ich Kommentare zu lesen, scheint es, wie ich, eine Maschine zu leihen, die CPU ist, ist alpha, arm oder ppc.
Weiß jemand, wo ich diese Art von Maschine verwenden kann, auch das ist nicht kostenlos?
Ursprung:
Ich teste den folgenden Code.
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
}
Ich weiß, dass die Leistung, nicht jedoch 0.
sein kann, ganz gleich, wie viel Male habe ich versucht, habe ich immer 1.
Ist dies wegen meiner CPU x86-Architektur ist?
Wenn nicht, wie kann ich dieses Problem beheben?
(BTW, ich kenne CppMem. Aber es kann keine Schleife verwenden.)
Vielleicht versuchen http://www.1024cores.net/home/relacy-race-detector/rrd-Introduction? –
Wenn Sie keine Hardware haben, die die Bestellung ausreichend vereinfacht hat, können Sie dies möglicherweise nicht sehen. Kannst du das auf einem DEC Alpha oder einer Playstation ausführen? –
Ich bin nicht sicher, ob dies einen Unterschied machen könnte, aber es scheint wahrscheinlich, dass beide Zahlen sehr nahe beieinander im Speicher sind, sehr wahrscheinlich auf der gleichen Seite. Vielleicht sehen Sie unterschiedliche Ergebnisse, wenn Sie sie auf verschiedene Seiten setzen. – 5gon12eder