Предоставляет ли С++ 11 (не требуется) выпуск/получение семантики для ключевого слова volatile - программирование
Подтвердить что ты не робот

Предоставляет ли С++ 11 (не требуется) выпуск/получение семантики для ключевого слова volatile

Начиная с Visual С++ 2005, Microsoft сделала дополнительные гарантии заказа для доступа к типам volatile, которые не требуются стандарту С++.

Что-нибудь в Стандарте С++ фактически запрещает эти гарантии? Документация Microsoft, кажется, так думает.

Пожалуйста, дайте мне знать, разрешает ли Стандарт заказ, реализованный Microsoft, а также проголосовать за этот отчет об ошибке:

4b9b3361

Ответ 1

Реализация, безусловно, позволяет делать что-то сверх того, что требуется, если оно соответствует требованиям, установленным стандартом. Добавление семантики release/получения в объект volatile определенно находится в пределах области действия. Я не думаю, что есть интерес к комитету С++, чтобы изменить семантику (мы только начинаем новую неделю обсуждения С++ в Портленде с Herb прямо сейчас, говоря о том, как организовать встречу).

Ответ 2

Стандарт требует, чтобы доступ к неустойчивым объектам оценивался строго в соответствии с правилами абстрактной машины, что означает примерно "не оптимизировать", но не более того. Например, компилятору не разрешено кэшировать значение в регистре или выполнять общее исключение подвыражения. Он должен делать именно то, что вы говорите.

Таким образом, для всех стандартных забот volatile имеет семантику memory_order_relaxed (она не указывает ничего другого). Это не значит, что вам не разрешено выполнять что-то более строгое, конечно.

Компилятор Microsoft всегда (начиная с 2005 года, как отмечает Бен Вейгт) рассматривал volatile как получение/выпуск, что приводит к тому, что многие люди принимают "volatile == threadsafe", что в свою очередь привело к тому, что многие статьи превратили это в "неустойчивый бесполезен!" и "изменчивость - это зло".

Вероятная причина, по которой MS рекомендует использовать реализацию ISO, заключается в том, что это приводит к тому, что их компилятор ведет себя как любой другой компилятор, не более неприятные сюрпризы.