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