Я хотел бы добавить, что volatile также очень полезна при работе с многопоточными приложениями, т. Е. У вас есть основной поток (где живет main ()), и вы создаете рабочий поток, который будет вращаться, пока переменная "app_running" правда. main () контролирует, является ли «app_running» истинным или ложным, поэтому, если вы не добавите атрибут volatile в объявление «app_running», если компилятор оптимизирует доступ к «app_running» в коде, запущенном вторичным потоком, main ) может изменить "app_running" на false, но вторичный поток будет продолжать работать, потому что значение было кэшировано. Я видел такое же поведение при использовании gcc в Linux и VisualC ++. Атрибут volatile, помещенный в объявление app_running, решил проблему. Таким образом, это сценарий, в котором никакие аппаратные прерывания или ядро не используются при изменении значения таких переменных.