Если mem
местоположение общей памяти, сделайте мне нужно:
XCHG EAX,mem
или:
LOCK XCHG EAX,mem
сделать обмен атомарно?
Поиск с помощью Google этого приводит и к да и к никаким ответам. Кто-либо знает это окончательно?
Согласно 80386 Руководству по эксплуатации , БЛОКИРОВКА ШИНЫ
устанавливается на время обмена. Префикс LOCK
не имеет приоритета для этой операции, как и значение уровня привилегий ввода-вывода .
Я предлагаю, поскольку в документации указано, что BUS LOCK
утверждается независимо от наличия префикса LOCK
, LOCK XCHG EAX, mem
иначе безопасно. В случае сомнений добавьте LOCK
.
Документация Intel кажется довольно ясной, что она избыточна.
Архитектура Intel® IA-32 Руководство разработчика программного обеспечения Том 3А: Руководство по системному программированию, часть 1
7.1.2.1 гласит:
Операции, при выполнении которых процессор автоматически следует семантике LOCK, являются следующими: следует:
- При выполнении инструкции XCHG, которая обращается к памяти.
Аналогичным образом
Архитектуры Intel® 64 и IA-32 Руководство разработчика программного обеспечения Том 2B: Ссылка на набор команд, N-Z
XCHG:
Если ссылка на операнд памяти, автоматически включается протокол блокировки процессора. реализуется на время операции обмена, независимо от наличия или отсутствия префикса LOCK или значения IOPL.
Обратите внимание, что это на самом деле не означает, что сигнал LOCK # утверждается независимо от того, используется префикс LOCK или нет, 7.1.4 описывает, как на более поздних процессорах семантика блокировки сохраняется без LOCK #, если область памяти кэшируется. Умно и определенно выше моей головы.
Начиная с 386 дней, xchg будет утверждать сигнал блокировки независимо от того, поставили ли вы на него префикс блокировки. Документация Intel довольно четко описывает это в справочнике по набору инструкций IA-32 N-Z.