volatile
変数の読み書きを必ず実際に行うようコンパイラに指示する、CおよびC++の型修飾子。
コンパイラは通常、メモリはプログラム自身が変更したときにしか変わらないと仮定する。そのためフラグを待つループが無限ループに最適化されたり、同じアドレスへの連続した2回の書き込みが1回にまとめられたりする。ハードウェアレジスタや割り込みで立てられるフラグにとっては、どちらの最適化も致命的だ。1989年のANSI Cで導入されたvolatileは、その変数についてだけこれらを無効にする。
そして、できるのはそれだけである。原子性は保証せず、他の変数に対する順序も保証せず、CPUによるアクセスの並べ替えも自由なままだ。複数コアのスレッド間ではアトミック操作とメモリバリアが必要になる。Linuxカーネルのドキュメントには「Why the volatile type class should not be used」という題のページまである。ちなみにJavaのvolatileは別物で、本物の順序保証を持つ。同じ単語でも約束している内容は違う。