На многоядерном x86 нужен ли LOCK в качестве префикса для XCHG? - PullRequest
19 голосов
/ 30 июня 2010

Если mem - это разделенная память, мне нужно:

XCHG EAX,mem

или

LOCK XCHG EAX,mem

делать обмен атомарно?

Погуглив это, вы получите ответы как да, так и нет. Кто-нибудь знает это окончательно?

Ответы [ 3 ]

25 голосов
/ 30 июня 2010

Документация Intel кажется довольно ясной, что она избыточна.

IA-32 Intel® Architecture Руководство разработчика программного обеспечения Том 3А: Руководство по системному программированию, часть 1

7.1.2.1 говорит:

Операции, в которых процессор автоматически следует семантике LOCK, следующим образом:

  • При выполнении инструкции XCHG, которая ссылается на память.

Аналогично,

Архитектура Intel® 64 и IA-32 Руководство разработчика программного обеспечения Том 2Б: Справочник инструкций, N-Z

XCHG:

Если имеется ссылка на операнд памяти, протокол блокировки процессора автоматически реализуется на время операции обмена независимо от наличия или отсутствия префикса LOCK или значения IOPL.

Обратите внимание, что это фактически не означает, что сигнал LOCK # утверждается независимо от того, используется ли префикс LOCK, 7.1.4 описывает, как на более поздних процессорах семантика блокировки сохраняется без LOCK #, если ячейка памяти кэшируется. Умно и определенно над моей головой.

12 голосов
/ 30 июня 2010

Начиная с 386 дней, xchg выдаст сигнал блокировки независимо от того, наложен ли на него префикс блокировки или нет. Документация Intel достаточно ясно описывает это в справочнике по набору команд IA-32 N-Z.

2 голосов
/ 30 июня 2010

Согласно 80386 Руководство по эксплуатации , BUS LOCK утверждается на время обмена. Префикс LOCK не имеет приоритета для этой операции и не имеет значения Уровень привилегий ввода / вывода .

Мое предложение заключается в том, что, поскольку в документации говорится, что BUS LOCK устанавливается независимо от наличия префикса LOCK, LOCK XCHG EAX, mem в противном случае безопасен. В случае сомнений добавьте LOCK.

...