Short & amp; быстрый ответ: volatile
(почти) бесполезен для платформо-агностического многопоточного программирования приложений. Он не обеспечивает никакой синхронизации, не создает забора памяти и не обеспечивает порядок выполнения операций. Он не делает операции атомарными. Это не делает ваш код волшебным потоком в безопасности. volatile
может быть единственным непонятым средством во всех C ++. См. этот , этот и этот для получения дополнительной информации о volatile
С другой стороны, volatile
имеют некоторое применение, которое может быть не столь очевидным. Его можно использовать так же, как и использовать const
, чтобы помочь компилятору показать вам, где вы можете ошибиться при доступе к некоторому совместно используемому ресурсу незащищенным способом. Это использование обсуждается Александреску в этой статье . Тем не менее, в основном это используется система типа C ++, которая часто рассматривается как средство и может вызывать Undefined Behavior.
volatile
специально предназначалось для использования при взаимодействии с аппаратным обеспечением с отображением памяти, обработчиков сигналов и команды машинного кода setjmp. Это делает volatile
прямо применимым к программированию на системном уровне, а не к нормальному программированию на уровне приложений.
В стандарте C ++ 2003 не говорится, что volatile
применяет любую семантику Acquire или Release для переменных. Фактически, стандарт полностью умалчивает обо всех вопросах многопоточности. Однако определенные платформы действительно применяют семантику Acquire и Release в переменных volatile
.
Стандарт C ++ 11 теперь делает подтверждают многопоточность непосредственно в модели памяти и lanuage, и она предоставляет библиотечные возможности для решения этой проблемы независимо от платформы. Однако семантика volatile
все еще не изменилась. volatile
все еще не является механизмом синхронизации. Bjarne Stroustrup говорит так же в TCPPPL4E:
Не используйте
volatile
, за исключением низкоуровневого кода, который напрямую связан с оборудованием.Не предполагайте, что
blockquote>volatile
имеет особое значение в модели памяти. Это не. Это не так, как в некоторых более поздних языках - механизм синхронизации. Чтобы получить синхронизацию, используйтеatomic
,mutex
илиcondition_variable
.[/ End update]
Вышеприведенное все применимо к C ++ самого языка, как это определено Стандартом 2003 года (и теперь стандартом 2011 года). Однако некоторые конкретные платформы добавляют дополнительные функциональные возможности или ограничения на то, что делает
volatile
. Например, в MSVC 2010 (по крайней мере) семантика получения и выпуска применяется к определенным операциям в переменныхvolatile
. Из MSDN :При оптимизации компилятор должен поддерживать упорядочение среди ссылок на изменчивые объекты, а также ссылки на другие глобальные объекты. В частности,
Запись в изменчивый объект (volatile write) имеет семантику Release; ссылка на глобальный или статический объект, который возникает до того, как запись в энергозависимый объект в последовательности команд произойдет до этой изменчивой записи в скомпилированном двоичном файле.
Чтение изменчивого объекта (изменчивое чтение) имеет Получить семантику; ссылка на глобальный или статический объект, который возникает после считывания энергозависимой памяти в последовательности команд, будет возникать после этого изменчивого чтения в скомпилированном двоичном файле.
blockquote>Однако вы можете принять к сведению факт, что если вы будете следовать приведенной выше ссылке, в комментариях будет высказано мнение о том, применимы ли в этом случае семантика на самом деле или нет.