Используйте XADD или MOV вместо инструкции ADD!
См. Также MFENCE , LFENCE и SFENCE инструкции!
EDIT:
Вы не можете использовать инструкцию LOCK с командой ADD, если исходный операнд является операндом памяти!
От: «Руководство разработчика программного обеспечения Intel® 64 и IA-32 Architectures»
Префикс LOCK может быть добавлен только перед
к следующим инструкциям и только
к этим формам инструкций
где целевой операнд является
операнд памяти: ADD, ADC, AND, BTC,
БТР, БТС, CMPXCHG, CMPXCH8B, DEC, INC,
NEG, НЕ, ИЛИ, SBB, SUB, XOR, XADD и
XCHG. Если префикс LOCK используется с
одна из этих инструкций и
операнд источника является операндом памяти,
неопределенное исключение кода операции (#UD) может
быть сгенерированным. Неопределенный код операции
исключение также будет сгенерировано, если
префикс LOCK используется с любым
инструкция не в списке выше.
Инструкция XCHG всегда утверждает
LOCK # сигнал независимо от
наличие или отсутствие префикса LOCK
EDIT2:
Форма: «Руководство разработчика программного обеспечения Intel® 64 и IA-32, Volume3A»
8.1.1 Гарантированные атомные операции.
Процессор Intel486 (и новее
процессоры, так как) гарантирует, что
следующие основные операции с памятью
всегда выполняется атомарно:
- Чтение или запись байта
- Чтение или запись выровненного слова
на 16-битной границе
- Чтение или запись двойного слова, выровненного по 32-битной границе
Процессор Pentium (и новее
процессоры, так как) гарантирует, что
следующие дополнительные операции с памятью
всегда будет выполняться атомарно:
- Чтение или запись четырех слов, выровненных по 64-битной границе
- 6-битный доступ к не кэшированным областям памяти, которые вписываются в 32-битный
шина данных Процессоры семейства P6
(и более новые процессоры с тех пор)
гарантировать, что следующие
дополнительная операция памяти будет
всегда выполняется атомарно:
- Нераспределенные 16-, 32- и 64-битные обращения к кешируемой памяти, которые соответствуют
внутри строки кэша
Доступ к кэш-памяти, которые
разделить по ширине шины, строки кэша,
и границы страницы не гарантируются
Intel Core 2 Duo, чтобы быть атомным,
Intel Core Duo, Pentium M, Pentium 4,
Intel Xeon, семейство P6, Pentium и
Процессоры Intel486. Intel Core 2
Duo, Intel Core Duo, Pentium M,
Pentium 4, Intel Xeon и семейство P6
процессоры обеспечивают сигналы управления шиной
которые разрешают подсистемы внешней памяти
сделать разделенный доступ атомарным;
однако доступ к данным без выравнивания будет
серьезно повлиять на производительность
процессор и его следует избегать.
Итак, для чтения я предпочитаю использовать CMPXCHG инструкцию с префиксом LOCK, например:
LOCK CMPXCHG EAX, [J]
Для записи:
MOV [J], EAX
SFENSE
.