Ключевое слово volatile в C/C++ используется для указания компилятору, что значение переменной может быть изменено внешними факторами, не контролируемыми текущим потоком выполнения программы. Это может быть:
Без volatile компилятор может оптимизировать доступ к переменной, предполагая, что ее значение меняется только в явном коде. Например, он может кэшировать значение в регистре и многократно использовать его, игнорируя фактические изменения в памяти. Использование volatile запрещает подобные оптимизации, заставляя компилятор каждый раз считывать или записывать значение переменной непосредственно из или в память.
Примеры использования:
Чтение аппаратного регистра:
c
Доступ к переменной, разделяемой между потоками без использования явных механизмов синхронизации (не самый безопасный подход, но демонстрирует применение):
c
Важно отметить, что volatile гарантирует только то, что компилятор не будет оптимизировать доступ к переменной. Он не обеспечивает атомарность операций или синхронизацию между потоками. Для безопасной работы с общими данными в многопоточных средах необходимо использовать атомарные операции (из <atomic>) или примитивы синхронизации (мьютексы, семафоры и т.д.).