TGViewer
Евгений Козлов пишет про IT Евгений Козлов пишет про IT @careerunderhood · 2.84K subscribers
Post #405 1.99K
Concurrency, Synchronization and Consistency. Пост №11. Ключевое слово volatile в C - запрет оптимизаций на уровне компилятора.

Сегодня пост будет посвящен очень важной особенноcти языка C которая перекочевала в дальнейшем и в другие языки программирования (но по разному) - volatile. Это ключевое слово дает сигнал компилятору не делать никаких оптимизаций над этой переменной, так как значение переменной может измениться по сценарию который компилятор не сможет предугадать (например внезапное изменение из другого потока).

Определение не самое простое для понимания на слух, поэтому я подготовил несколько примеров:

Пример №1 - в программе 2 потока, основной и один сбоку, дочерний делает полезную работу пока основной не изменит переменную-флаг. Если запустите программу на своем компьютере с большой вероятностью она зависнет, потому что stop читается один раз, кешируется и больше не обновляется.

Пример №2 - программа идентична 1й но одно изменение - переменная stop объявлена как volatile. Такая программа не зависнет навечно и рано или поздно завершится. Почему? Потому что компилятор не применил к ней оптимизации и не кеширует ее на постоянной основе, перечитывая адрес из общей памяти.

Важно: volatile решает проблему видимости только на уровне оптимизаций компилятора. Как следствие:
- Оно не ставит барьеров памяти.
- Оно не делает операции атомарными.

Для потокобезопасности нужно использовать stdatomic.h / мьютексы / спинлоки рассмотренные ранее.

Где полезен volatile?
- Переменные - флаги в многопоточной программе (пример №2).
- Взаимодействие с железом. Значение в памяти может поменяться за пределами нашей программы и чтобы программа смогла увидеть эти изменения перемення должна быть volatile.

На этом сегодня всё. Чуть попозже, в постах про языки программирования рассмотрим какой смысл эта инструкция несет в других языках программирования. Сишка это все таки база и в ней это слово имеет фундаментальное значение.

Делитесь в комментариях впечатлениями от поста, буду рад если подсветите то что я упустил. Спасибо, что читали, до встречи!
GitHub concurrency-snippets/c/global-var-without-volatile.c at main · abstractart/concurrency-snippets Contribute to abstractart/concurrency-snippets development by creating an account on GitHub.
  • 🔥 8
  • 👍 3
  • ❤ 2
More from @careerunderhood
  1. Oct 2, 2026Пока от темы Concurrency далеко не ушли. В последнем цикле я если и упоминал вопросы произ…
  2. Sep 30, 2026Результаты опроса меня впечатлили. Большинству интересны истории из работы. Поехали, начне…
  3. Sep 25, 2026Post #470
  4. Sep 21, 2026Concurrency, Synchronization and Consistency. Non-blocking. Оглавление Введение - Блокирую…
  5. Sep 21, 2026Concurrency and Consistency. Non-blocking, lock-free and async. Пост №12. Заключение. Когд…
  6. Sep 20, 2026Concurrency and Consistency. Non-blocking, lock-free and async. Пост №11. Самые важные фак…
Threads Profile ViewerView any public Threads profile without an account.Open ThreadLook →Writing with AI? Make it sound human.Metric37 rewrites AI drafts so they read naturally. Free AI detector, 1,500 words free.Try Metric37 →