2015-12-05 1 views
7

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.)

+0

Vielleicht versuchen http://www.1024cores.net/home/relacy-race-detector/rrd-Introduction? –

+0

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? –

+0

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

Antwort

3

Was Sie erleben, ist kein "Problem". Zumindest nicht, was den Standard betrifft.

Wenn die Bestellung entspannt ist, bedeutet dies nur, dass die Bestellung nicht mehr garantiert ist. Dies bedeutet nicht, dass die Implementierungen müssen in verschiedenen Aufträgen setzen.

Ein anderer Compiler kann es zeigen; dann wieder, vielleicht nicht. Hell, nur die Optimierung ändern könnte dazu führen, dass es passiert. Dann wieder, vielleicht nicht. Es gibt schließlich nichts, was Sie tun können, um Garantie sehen die andere Reihenfolge (außerhalb der Emulation von einer Art oder ähnlichen Tools). Nur weil Sie sagen, dass etwas möglicherweise möglich sein kann, stellt nicht sicher, dass es wird oder müssen.

+0

Soweit ich Speicherordnung verstehe, _compiler_ ist berechtigt, Fachgeschäfte neu zu ordnen, sollte es aus irgendeinem Grund besser entscheiden. In diesem Fall könnte man diese "Schwäche" sogar auf x86 beobachten. Aber ich kann das mit GCC und Clang nicht verstehen. Sie ordnen nicht-atomare Speicher neu an oder chargen sie mit SIMD. Aber sobald ich die Variablen atomar gemacht habe, werden Speicher regelmäßig zu Ordnungen. –

+0

@ConstantinBaranov: Es gibt zwei Fragen: ob der Compiler die Anweisungen in eine andere Reihenfolge bringen kann und ob die * Hardware * sie in der angegebenen Reihenfolge ausführen wird. Wenn der Compiler keine Notwendigkeit sieht, sie in eine andere Reihenfolge zu bringen, wird dies nicht der Fall sein. Nur weil die Befehle in einer anderen Reihenfolge kommen, bedeutet das nicht, dass Sie sie ohne Emulation oder anderes Deep Debugging sehen können. –