Microsoft предлагает функцию InterlockedCompareExchange
для выполнения операций атомного сравнения и свопинга. Существует также _InterlockedCompareExchange
внутренняя.
В x86 они реализованы с помощью команды cmpxchg
.
Однако, просматривая документацию по этим трем подходам, они, похоже, не согласны с требованиями к выравниванию.
Intel справочное руководство ничего не говорит о выравнивании (кроме этого, если включена проверка выравнивания и сделана ссылка без привязки к памяти, исключение генерируется)
Я также посмотрел префикс lock
, в котором, в частности, указано, что
Целостность префикса LOCK не влияет на выравнивание поля памяти.
(акцент мой)
Итак, Intel, похоже, говорит, что выравнивание не имеет значения. Операция будет атомой, несмотря ни на что.
Внутренняя документация _InterlockedCompareExchange
также ничего не говорит о выравнивании, однако функция InterlockedCompareExchange
заявляет, что
Параметры этой функции должны быть выровнены на 32-битной границе; в противном случае функция будет непредсказуемо работать на многопроцессорных системах x86 и любых системах, отличных от x86.
Итак, что дает?
Требуются ли требования выравнивания для InterlockedCompareExchange
только для того, чтобы убедиться, что функция будет работать даже на процессоре pre-486, где команда cmpxchg
недоступна?
Вероятно, это похоже на приведенную выше информацию, но я хотел бы быть уверен, прежде чем полагаться на нее.:)
Или требуется выравнивание, требуемое ISA для обеспечения атомарности, и я просто искал неправильные места в справочных руководствах Intel?