volatile
Een type-qualifier in C en C++ die de compiler vertelt dat elke lees- en schrijfactie op de variabele ook echt moet plaatsvinden.
Compilers gaan er normaal van uit dat geheugen alleen verandert wanneer het programma dat doet. Zo kan een lus die op een vlag wacht worden wegoptimaliseerd tot een oneindige lus, en kunnen twee opeenvolgende schrijfacties naar hetzelfde adres worden samengevoegd. Voor een hardwareregister of een vlag die door een interrupt wordt gezet is beide fataal. volatile, in 1989 ingevoerd met ANSI C, schakelt die optimalisaties uit voor die ene variabele.
Meer doet het ook niet. Het biedt geen atomiciteit en geen ordening ten opzichte van andere variabelen, en de cpu mag toegangen nog steeds herschikken. Threads op meerdere kernen hebben atomics en geheugenbarrières nodig; de Linux-kerneldocumentatie heeft een hele pagina getiteld “Why the volatile type class should not be used”. Het volatile van Java is overigens een ander beest met echte ordeningsgaranties: hetzelfde woord, andere beloftes.