Я хотів би додати, що volatile також дуже корисний при роботі з багатопотоковими програмами, тобто у вас є основний потік (де живе main ()) і ви створюєте робочий потік, який буде продовжувати обертатися, поки змінна "app_running" відповідає істині. main () контролює, чи є "app_running" істинним чи хибним, тому, якщо ви не додаєте атрибут volatile до оголошення "app_running", якщо компілятор оптимізує доступ до "app_running" у коді, запущеному вторинним потоком, main ( ) може змінити "app_running" на false, але вторинний потік буде продовжувати працювати, оскільки значення було кешоване. Я спостерігав таку ж поведінку, використовуючи gcc у Linux та VisualC ++. Атрибут "volatile", поміщений в декларацію "app_running", вирішив проблему. Тому,
volatile
Об'єкти також можуть бути змінені процесами, які взагалі не залучають центральний процесор. Наприклад, отриманий байт регістр у периферійному пристрої зв'язку може збільшуватися при отриманні байта (і це може навіть викликати переривання). Інший приклад - реєстр прапорців, що очікують на переривання, у периферійному пристрої.