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