#include <iostream>// Пример: регистр аппаратного устройства (гипотетический)volatile int* hardware_register = reinterpret_cast<volatile int*>(0x12345678);void waitForSignal() { // Без volatile компилятор мог бы оптимизировать цикл в бесконечный, // считая, что значение не меняется while (*hardware_register == 0) { // ждём, пока регистр не станет ненулевым } std::cout << "Сигнал получен!\n";}// Пример с обычной переменной (не рекомендуется без причины)volatile int flag = 0;void simulateExternalChange() { // Представим, что другой поток или прерывание меняет flag // (в реальности для потоков нужно std::atomic!) flag = 1;}int main() { // В реальном коде volatile используется редко: // - в embedded-системах // - при взаимодействии с hardware // - в signal handlers (ограниченно) // Для многопоточности volatile НЕ подходит! simulateExternalChange(); if (flag) { std::cout << "Флаг установлен\n"; } return 0;}
#include <iostream>// Пример: регистр аппаратного устройства (гипотетический)volatile int* hardware_register = reinterpret_cast<volatile int*>(0x12345678);void waitForSignal() { // Без volatile компилятор мог бы оптимизировать цикл в бесконечный, // считая, что значение не меняется while (*hardware_register == 0) { // ждём, пока регистр не станет ненулевым } std::cout << "Сигнал получен!\n";}// Пример с обычной переменной (не рекомендуется без причины)volatile int flag = 0;void simulateExternalChange() { // Представим, что другой поток или прерывание меняет flag // (в реальности для потоков нужно std::atomic!) flag = 1;}int main() { // В реальном коде volatile используется редко: // - в embedded-системах // - при взаимодействии с hardware // - в signal handlers (ограниченно) // Для многопоточности volatile НЕ подходит! simulateExternalChange(); if (flag) { std::cout << "Флаг установлен\n"; } return 0;}