27 Stimmen

Ist auf einem x86-Mehrkernsystem ein LOCK als Präfix für XCHG erforderlich?

Wenn mem ein gemeinsamer Speicherplatz ist, benötige ich:

XCHG EAX,mem

oder:

LOCK XCHG EAX,mem

um den Austausch atomar durchzuführen?

Wenn Sie diese Frage googeln, finden Sie sowohl Ja- als auch Nein-Antworten. Weiß jemand etwas Genaues darüber?

32voto

CB Bailey Punkte 693084

Die Dokumentation von Intel scheint ziemlich klar zu sein, dass dies redundant ist.

IA-32 Intel® Architektur Handbuch für Softwareentwickler Band 3A: Handbuch zur Systemprogrammierung, Teil 1

7.1.2.1 sagt:

Die Operationen, bei denen der Prozessor automatisch der LOCK-Semantik folgt, sind folgende wie folgt:

  • Bei der Ausführung einer XCHG-Anweisung, die auf Speicher verweist.

Ähnlich,

Intel® 64 und IA-32 Architekturen Handbuch für Softwareentwickler Band 2B: Befehlssatz-Referenz, N-Z

XCHG:

Wenn ein Speicheroperand referenziert wird, wird das Sperrprotokoll des Prozessors automatisch für die Dauer des Austauschvorgangs implementiert, unabhängig davon, ob das Präfix LOCK vorhanden ist oder nicht und unabhängig vom Wert der IOPL.

Beachten Sie, dass dies nicht bedeutet, dass das LOCK#-Signal unabhängig von der Verwendung des LOCK-Präfixes aktiviert wird. In Abschnitt 7.1.4 wird beschrieben, wie auf neueren Prozessoren die Locking-Semantik ohne LOCK# erhalten bleibt, wenn die Speicherstelle im Cache gespeichert ist. Clever, und definitiv über meinen Verstand.

12voto

Yann Vernier Punkte 14750

Seit 386 Tagen setzt xchg das Lock-Signal durch, unabhängig davon, ob Sie das Lock-Präfix darauf setzen oder nicht. Die Dokumentation von Intel wird dies in der IA-32-Befehlssatzreferenz N-Z recht deutlich behandelt.

3voto

Scott S. McCoy Punkte 1077

Gemäß der 80386 Gebrauchsanweisung , BUS LOCK wird für die Dauer des Austauschs geltend gemacht. Die LOCK Präfix hat bei diesem Vorgang keinen Vorrang und auch der Wert der E/A-Berechtigungsstufe .

Ich schlage vor, da in der Dokumentation steht, dass BUS LOCK wird unabhängig vom Vorhandensein der LOCK Vorwahl, LOCK XCHG EAX, mem ist ansonsten sicher. Im Zweifelsfall fügen Sie eine LOCK .

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X