Es ist bekannt, dass auf x86 für die Operationen load()
und store()
Speicherbarrieren memory_order_consume, memory_order_acquire, memory_order_release, memory_order_acq_rel
keine Prozessoranweisungen für den Cache und Pipeline und Montage-Code immer std::memory_order_relaxed
entspricht erfordert, und diese Beschränkungen sind nur dann erforderlich, für die Optimierung der Compiler: http://www.stdthread.co.uk/forum/index.php?topic=72.0Benötigt die Semantik von `std :: memory_order_acquire` Prozessoranweisungen auf x86/x86_64?
Und dieser Code Zerlegen Code bestätigt dies für store()
(MSVS2012 x86_64):
std::atomic<int> a;
a.store(0, std::memory_order_relaxed);
000000013F931A0D mov dword ptr [a],0
a.store(1, std::memory_order_release);
000000013F931A15 mov dword ptr [a],1
Aber dieser Code dies für load()
(MSVS2012 x86_64) nicht comfirm, mit lock cmpxchg
:
int val = a.load(std::memory_order_acquire);
000000013F931A1D prefetchw [a]
000000013F931A22 mov eax,dword ptr [a]
000000013F931A26 mov edx,eax
000000013F931A28 lock cmpxchg dword ptr [a],edx
000000013F931A2E jne main+36h (013F931A26h)
std::cout << val << "\n";
Aber Anthony Williams said:
some_atomic.load (std :: memory_order_acquire) macht genau Drop to eine einfache Ladeanweisung und some_atomic.store (Std :: memory_order_release) fällt auf eine einfache speichern Anweisung.
Wo bin ich falsch, und nicht die Semantik von std::memory_order_acquire
erfordert Prozessoranweisungen auf x86/x86_64 lock cmpxchg
oder nur einen einfachen Ladebefehl mov
wie sagte Anthony Williams?
ANTWORT: Es ist die gleiche wie dieser Bug-Report: http://connect.microsoft.com/VisualStudio/feedback/details/770885
Ich bin mir nicht sicher, was der Compiler erzeugt, ist notwendigerweise ein guter Weg, um die Anforderungen einer bestimmten Funktionalität zu bestimmen - es ist nicht unbekannt, dass Compiler "mehr tun, als sie brauchen". –
@Mats Petersson Ja, aber es gibt nichts einfacher als nichts zu tun. Und das wurde vom Compiler verlangt, nichts als 'mov'. Wirklich die Entwickler von Microsoft haben mit dieser die einfachste Aufgabe gescheitert: "nichts tun"? :) – Alex
Ich weiß MS VC (mindestens einige Versionen) wird zusätzliche "Sperren" auf Variablen als "volatile" deklariert generieren - nicht, weil der C++ - Standard es erfordert, sondern weil einige Bits des Codes verwendet, um plötzlich auf Single-Core-Prozessoren arbeiten funktionieren schlecht, wenn Sie SMP-Systeme verwenden. Dies ähnelt einer dieser Situationen. –