Из документации:
Специально для Microsoft
Когда используется параметр компилятора /volatile:ms — по умолчанию, когда нацелены архитектуры, отличные от ARM, — компилятор генерирует дополнительный код для поддержания порядка ссылок на изменчивые объекты в дополнение к поддержанию порядка ссылок на другие глобальные объекты. В частности:
- Запись в изменчивый объект (также известная как изменчивая запись) имеет семантику Release; то есть ссылка на глобальный или статический объект
, которая возникает перед записью в изменчивый объект в последовательности инструкций
, будет происходить до этой изменчивой записи в скомпилированном
двоичном файле.- Чтение изменчивого объекта (также известное как изменчивое чтение) имеет семантику Acquire; то есть ссылка на глобальный или статический объект
, возникающая после чтения энергозависимой памяти в последовательности инструкций
, будет происходить после этого чтения энергозависимой памяти в скомпилированном двоичном файле.Это позволяет использовать энергозависимые объекты для блокировки и освобождения памяти в многопоточных приложениях.
Это, безусловно, гарантирует, что volatile
не позволит компилятору выполнять переупорядочивание инструкций во время компиляции (поскольку в нем явно указано, что последовательность инструкций будет такой же в скомпилированном двоичном файле).
Но, как мы все знаем, есть еще такая вещь, как аппаратное переупорядочивание (например, ЦП может переупорядочивать инструкции по собственной воле). volatile
также препятствует этому? Я знаю, что это делают примитивы синхронизации (например, мьютексы), но как насчет специфичных для MS volatile
?
/volatile
для MS пытается обеспечить функциональностьstd::atomic
, которой не было до C++11. - person Mysticial   schedule 11.08.2016volatile
, что предотвращает переупорядочивание ЦП. - person Martin Bonner supports Monica   schedule 11.08.2016volatile
переменных являются атомарными. На самом деле это так, потому что x86 гарантирует атомарность операций чтения и записи для 1-байтовых переменных, но в MSDN это не гарантируетсяvolatile
. - person FrozenHeart   schedule 11.08.2016std::memory_order_xxx
, которую используетstd::atomic
. Хотя семантика приобретения/выпуска для чего-то, что не является атомарным, кажется довольно э... ненадежным. - person Mysticial   schedule 11.08.2016volatile
для обратной совместимости. Если вы обнаружите, что он работает не так, как вы ожидаете, при наличии новых функций, таких как лямбда-выражения, при подаче отчета об ошибке вы, вполне возможно, услышите, что вы пишете новый код, ошибка не влияет на существующий код. код, и мы уже сказали вам использовать режим/volatile:iso
в новом коде - person Ben Voigt   schedule 11.08.2016/volatile:iso
, потому что это может сломать старый код. Эти два варианта плохо сочетаются. Поэтому я сомневаюсь, что вы услышите такой ответ. Хотя я не знаю, позиция Microsoft в последнее время меня очень удивила. - person Cody Gray   schedule 11.08.2016