Re[3]: Volatile и предупреждение C5220
От: fk0 Россия https://fk0.name
Дата: 03.01.22 13:53
Оценка: +1 -1
Здравствуйте, Евгений Музыченко, Вы писали:

М>>зачем понадобились volatile-переменные?


ЕМ>Для реализации некоторых легковесных методов синхронизации. Например, там, где циклически выполняется группа операций, и этот цикл нужно останавливать по внешнему сигналу. Использовать там средства ОС избыточно — по уши хватит и volatile-переменных.


OMG! Полярный песец!

Volatile не является барьером. Не атомарно. И из него никаких толком алгоритмов не построить, даже
алгоритм Петерсона требует чтоб число записывалось за один раз, атомарно.

И самое поганое, запись в volatile-переменные не упорядочена по сравнению с другими обращениями
к памяти. Компилятор может тебе сделать запись в volatile... Знаешь как? Вынести из цикла все такие записи
куда-нибудь в конец функции и выполнив там их оптом. Так оптимальней (реальная история, встретился на MIPS
на GCC 6-й версии). Нужен компиляторный барьер (роль которого впрочем выполнит любой вызов, даже inline
функции). И нужна инструкция синхронизации кешей, чего не явным образом никак не получить.

Все современные вычислительные машины, библиотеки, программы... используют для построения примитивов
синхронизации атомарные инструкции, как правило совмещённые с "аппаратными" барьерами памяти, включающими
в себя не только физическую запись регистров в память компилятором, но и выполнение специальной инструкции,
синхронизирующей кеши у процессоров (без чего, собственно, всё бесполезно! так как другой процессор
иначе эту volatile переменную не увидит).

Ты пользуешься тем, что на x86 архитектуре всё сделано, чтоб подложить соломки индусским программистам,
чтоб оно хоть как-то работало даже если и не должно. ARM или MIPS таких ошибок не простит. Особенно
современный 64-битный ARMv8, ARMv9.

Надо не морочить мозг, если речь про C++, то есть std::atomic. Если голый C -- в GCC есть два набора
builtin функций для того же. Если Windows -- спец. функции в Win32 API.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.