Concurrency, Synchronization and Consistency. Пост №11. Ключевое слово volatile в C - запрет оптимизаций на уровне компилятора.
Сегодня пост будет посвящен очень важной особенноcти языка C которая перекочевала в дальнейшем и в другие языки программирования (но по разному) - volatile. Это ключевое слово дает сигнал компилятору не делать никаких оптимизаций над этой переменной, так как значение переменной может измениться по сценарию который компилятор не сможет предугадать (например внезапное изменение из другого потока).
Определение не самое простое для понимания на слух, поэтому я подготовил несколько примеров:
Пример №1 - в программе 2 потока, основной и один сбоку, дочерний делает полезную работу пока основной не изменит переменную-флаг. Если запустите программу на своем компьютере с большой вероятностью она зависнет, потому что stop читается один раз, кешируется и больше не обновляется.
Пример №2 - программа идентична 1й но одно изменение - переменная stop объявлена как volatile. Такая программа не зависнет навечно и рано или поздно завершится. Почему? Потому что компилятор не применил к ней оптимизации и не кеширует ее на постоянной основе, перечитывая адрес из общей памяти.
Важно: volatile решает проблему видимости только на уровне оптимизаций компилятора. Как следствие:
- Оно не ставит барьеров памяти.
- Оно не делает операции атомарными.
Для потокобезопасности нужно использовать stdatomic.h / мьютексы / спинлоки рассмотренные ранее.
Где полезен volatile?
- Переменные - флаги в многопоточной программе (пример №2).
- Взаимодействие с железом. Значение в памяти может поменяться за пределами нашей программы и чтобы программа смогла увидеть эти изменения перемення должна быть volatile.
На этом сегодня всё. Чуть попозже, в постах про языки программирования рассмотрим какой смысл эта инструкция несет в других языках программирования. Сишка это все таки база и в ней это слово имеет фундаментальное значение.
Делитесь в комментариях впечатлениями от поста, буду рад если подсветите то что я упустил. Спасибо, что читали, до встречи!
Post #405
1.99K