Ich habe den “Intel Optimization Guide Guide For Intel Architecture” gelesen.
Allerdings habe ich immer noch keine Ahnung, wann ich es verwenden sollte
_mm_sfence()
_mm_lfence()
_mm_mfence()
Könnte jemand erklären, wann diese beim Schreiben von Multithread-Code verwendet werden sollten?
@BeeOnRope: Ich habe diese Frage aktualisiert / neu markiert, um zu stellen, was meiner Meinung nach die eigentliche Frage war: über diese Eigenheiten in Multithread-Code (die ursprünglichen Tags enthielten Parallelverarbeitung.) Es gibt viele Fragen und Antworten zu den Maschinenanweisungen, aber diese ist anders, weil das Mem-Modell von C++ schwach ist. Sie möchten eine Möglichkeit, ein Acquiring-Load oder Release-Store durchzuführen ohne wodurch der Compiler ein nutzloses ausgibt
lfence
odersfence
, stoppt einfach die Neuordnung zur Kompilierzeit. (preshing.com/20120625/memory-ordering-at-compile-time). Verwenden Sie 2018 natürlich nur C11 stdatomic / C++11 std::atomic.– Peter Cordes
9. Juni 2018 um 16:02 Uhr
@PeterCordes Sie denken also, dass es bei dieser Frage in gewisser Weise um Compiler-Barrieren geht? Das heißt, eine gute Antwort könnte in etwa so lauten
lfence
undsfence
Anweisungen sind im Allgemeinen auf der x86-Assembly-Ebene nutzlos, aber Sie möchten vielleicht eine Compiler-Barriere einfügen, um Compiler-Neuordnungen zu verhindern? Übrigens kenne ich für die meisten Compiler keine feinkörnigeren als vollständigen Compiler-Barrieren, aber MSVC hat sie_[Read|Write]Barrier
. Ich denke, Sie könnten einige Arten von Barrieren mit Inline-Asm und cleverem Einsatz von Einschränkungen erfinden.– BeeOnRope
9. Juni 2018 um 16:46 Uhr
std::atomic_signal_fence(std::memory_order_release)
mit gcc scheint es sogar nicht-atomare Variablen zu ordnen, aber das kann ein Implementierungsdetail sein. Ich habe nicht unter die Haube geschaut.– Peter Cordes
9. Juni 2018 um 16:49 Uhr
@PeterCordes – es soll nicht-atomare Variablen bestellen, oder? Genau wie die meisten
mo_
Ordnungen auf atomaren Variablen ordnen auch irgendwie die umgebenden nicht-atomaren Zugriffe. Für Zäune ist die Reihenfolge von nicht-atomaren Variablen die hauptsächlich Zweck, denke ich. Vielleicht habe ich nicht verstanden, was du meinst…– BeeOnRope
9. Juni 2018 um 16:56 Uhr