volatile
Квалификатор типа в C и C++, сообщающий компилятору, что каждое чтение и запись переменной должны действительно произойти.
Обычно компиляторы исходят из того, что память меняется только самой программой. Поэтому цикл ожидания флага можно превратить в бесконечный, а две подряд идущие записи по одному адресу — слить в одну. Для аппаратного регистра или флага, выставляемого прерыванием, обе оптимизации фатальны. volatile, появившийся с ANSI C в 1989 году, отключает их для одной конкретной переменной.
Больше он ничего не делает. Он не даёт ни атомарности, ни упорядочения относительно других переменных, а процессор по-прежнему вправе переставлять обращения. Потокам на нескольких ядрах нужны атомарные операции и барьеры памяти; в документации ядра Linux есть целая страница под названием «Why the volatile type class should not be used». Кстати, volatile в Java — совсем другое дело, с настоящими гарантиями упорядочения: то же слово, другие обещания.