Wie in den anderen Antworten angegeben, ist das Sperrpräfix hier implizit, so dass es auf der Assembler-Ebene kein Problem gibt. Wenn Sie das als In-line-Assembler verwenden, liegt das Problem möglicherweise auf der C (oder C ++) Ebene. Hier müssen Sie sicherstellen, dass der Compiler keine Anweisungen in Bezug auf Ihre xchg
neu anordnet. Wenn Sie gcc (oder Cousins) verwenden, würden Sie in der Regel etwas tun:
deklarieren Sie die Anweisung als flüchtig und fügen Sie den "Speicher" Clobber hinzu.
Laut Kapitel 8 Bus-Sperrung des Intel 64 und IA-32 Architectures Software-Entwicklerhandbuch, Band 3A
Das Speicherordnungsmodell verhindert, dass Lasten und Speicher mit gesperrten Anweisungen, die früher oder später ausgeführt werden, neu angeordnet werden.
Somit fungiert die gesperrte XCHG
Anweisung als Speicherbarriere, und es wird keine zusätzliche Barriere benötigt.
Nein. xchg
wird garantiert in etwas kompiliert, was Konsistenz auf der Hardwareebene gewährleistet.
Die xchg-Anweisung hat ein implizites Sperrpräfix gemäß Intel-Handbüchern.
Tags und Links c c++ assembly x86 memory-fences