ChronoForms Листы действий Google Sheets не найдены

Short & amp; быстрый ответ: volatile (почти) бесполезен для платформо-агностического многопоточного программирования приложений. Он не обеспечивает никакой синхронизации, не создает забора памяти и не обеспечивает порядок выполнения операций. Он не делает операции атомарными. Это не делает ваш код волшебным потоком в безопасности. volatile может быть единственным непонятым средством во всех C ++. См. этот , этот и этот для получения дополнительной информации о volatile

С другой стороны, volatile имеют некоторое применение, которое может быть не столь очевидным. Его можно использовать так же, как и использовать const, чтобы помочь компилятору показать вам, где вы можете ошибиться при доступе к некоторому совместно используемому ресурсу незащищенным способом. Это использование обсуждается Александреску в этой статье . Тем не менее, в основном это используется система типа C ++, которая часто рассматривается как средство и может вызывать Undefined Behavior.

volatile специально предназначалось для использования при взаимодействии с аппаратным обеспечением с отображением памяти, обработчиков сигналов и команды машинного кода setjmp. Это делает volatile прямо применимым к программированию на системном уровне, а не к нормальному программированию на уровне приложений.

В стандарте C ++ 2003 не говорится, что volatile применяет любую семантику Acquire или Release для переменных. Фактически, стандарт полностью умалчивает обо всех вопросах многопоточности. Однако определенные платформы действительно применяют семантику Acquire и Release в переменных volatile.

[Обновление для C ++ 11]

Стандарт C ++ 11 теперь делает подтверждают многопоточность непосредственно в модели памяти и lanuage, и она предоставляет библиотечные возможности для решения этой проблемы независимо от платформы. Однако семантика volatile все еще не изменилась. volatile все еще не является механизмом синхронизации. Bjarne Stroustrup говорит так же в TCPPPL4E:

Не используйте volatile, за исключением низкоуровневого кода, который напрямую связан с оборудованием.

Не предполагайте, что volatile имеет особое значение в модели памяти. Это не. Это не так, как в некоторых более поздних языках - механизм синхронизации. Чтобы получить синхронизацию, используйте atomic, mutex или condition_variable.

blockquote>

[/ End update]

Вышеприведенное все применимо к C ++ самого языка, как это определено Стандартом 2003 года (и теперь стандартом 2011 года). Однако некоторые конкретные платформы добавляют дополнительные функциональные возможности или ограничения на то, что делает volatile. Например, в MSVC 2010 (по крайней мере) семантика получения и выпуска применяется к определенным операциям в переменных volatile. Из MSDN :

При оптимизации компилятор должен поддерживать упорядочение среди ссылок на изменчивые объекты, а также ссылки на другие глобальные объекты. В частности,

Запись в изменчивый объект (volatile write) имеет семантику Release; ссылка на глобальный или статический объект, который возникает до того, как запись в энергозависимый объект в последовательности команд произойдет до этой изменчивой записи в скомпилированном двоичном файле.

Чтение изменчивого объекта (изменчивое чтение) имеет Получить семантику; ссылка на глобальный или статический объект, который возникает после считывания энергозависимой памяти в последовательности команд, будет возникать после этого изменчивого чтения в скомпилированном двоичном файле.

blockquote>

Однако вы можете принять к сведению факт, что если вы будете следовать приведенной выше ссылке, в комментариях будет высказано мнение о том, применимы ли в этом случае семантика на самом деле или нет.

0
задан Gašper 18 January 2019 в 10:44
поделиться