Из documentation:ли MS-специфические летучие предотвратить инструкции аппаратного переназначения
Microsoft Конкретные
Когда летучие /: мс параметр компилятора используется, по умолчанию при кроме ARM архитектур target - компилятор генерирует дополнительный код для поддержания порядка среди ссылок на изменчивые объекты в , а также на поддержание порядка ссылок на другие глобальные объекты . В частности:
- Запись в изменчивый объект (также называемый volatile write) имеет семантику Release; то есть ссылка на глобальный или статический объект
, который возникает до того, как запись в энергозависимый объект в инструкции
будет происходить до того, как эта изменчивая запись будет записана в скомпилированном
двоичном.- Чтение изменчивого объекта (также известного как изменчивое чтение) имеет семантику Acquire; то есть ссылка на глобальный или статический объект
, который возникает после считывания энергозависимой памяти в инструкции
Последовательность будет происходить после этого волатильного чтения в скомпилированном двоичном файле.Это позволяет использовать изменчивые объекты для блокировки и освобождения памяти в многопоточных приложениях.
Это, безусловно, гарантирует, что volatile
предотвращает компилятор от выполнения инструкций время компиляции переупорядочения (потому что он явно указывает, что последовательность команд будет в скомпилированный двоичный то же ).
Но, как мы все знаем, есть такая вещь, как аппаратное переупорядочение (например, процессор может переупорядочить инструкции по своей воле). volatile
предотвращает это? Я знаю, что примитивы синхронизации (такие как мьютексы) делают, но как насчет MS-specific volatile
?
«Архитектура, отличная от ARM», MS, вероятно, означает x86 и x64. На x86 и x64 нагрузки не переупорядочиваются с другими нагрузками. А магазины не заказываются в других магазинах. (за некоторыми исключениями, такими как невременные магазины) IOW, если компилятор ничего не переупорядочивает, и процессор не будет. Кажется, что '/ volatile' для MS пытается обеспечить функциональность' std :: atomic', которая не существовала до C++ 11. – Mysticial
Кроме того, они говорят, что «имеет семантику выпуска», поэтому документация, безусловно, * утверждает, что '' volatile' предотвращает переупорядочение процессора. –
@Mysticial «Кажется, что/volatile для MS пытается обеспечить функциональность std :: atomic» - нет, это не так. Например, не гарантируется, что операции чтения и записи переменных «volatile» являются атомарными. Фактически, они - потому что x86 гарантирует атомарность операций чтения и записи для 1-байтовых переменных, но это не гарантируется в MSDN 'volatile' – FrozenHeart