Начиная с Visual C ++ 2005, Microsoft сделала дополнительные гарантии заказа для доступа к volatile
типы, которые не требуются стандартом C ++.
Что-нибудь в стандарте C ++ на самом деле запрещает эти гарантии? Документация Microsoft кажется так думает.
Пожалуйста, дайте мне знать, разрешает ли стандарт упорядочение, реализованное Microsoft, а также проголосуйте за этот отчет об ошибке:
Реализация, безусловно, позволяет делать что-то сверх того, что требуется, при условии, что она соответствует требованиям, установленным стандартом. Добавление семантики выпуска / приобретения к volatile
Объект определенно находится в пределах видимости. Я не думаю, что в комитете C ++ есть интерес к изменению семантики (мы только начинаем новую неделю обсуждения C ++ в Портленде с Хербом, который сейчас обсуждает, как организовать встречу).
Стандарт требует, чтобы доступ к изменчивым объектам оценивается строго по правилам абстрактной машины, что примерно означает «не оптимизировать», но не более того. Например, компилятору не разрешено кэшировать значение в регистре или выполнять обычное исключение подвыражения. Он должен делать именно то, что вы говорите.
Таким образом, для всех стандартных забот, volatile
имеет memory_order_relaxed
семантика (она не определяет ничего другого). Это, конечно, не означает, что вам не разрешено внедрять что-то более строгое.
Компилятор Microsoft всегда (с 2005 года как отмечает Бен Фойгт) volatile
как приобретение / выпуск, что приводит к тому, что многие люди принимают «volatile == threadsafe», что, в свою очередь, привело к тому, что многие статьи превратили это в «volatile бесполезно!» и «изменчиво зло».
Вероятная причина, по которой MS рекомендует использовать реализацию ISO, состоит в том, что это заставляет их компилятор вести себя как любой другой компилятор, больше никаких неприятных сюрпризов.