Летучие иногда полезны по следующей причине: этот код:
/* global */ bool flag = false;
while (!flag) {}
оптимизирован gcc:
if (!flag) { while (true) {} }
Что явно неверно, если флаг написан к другой теме. Обратите внимание, что без этой оптимизации механизм синхронизации, вероятно, работает (в зависимости от другого кода могут потребоваться некоторые барьеры памяти) - нет необходимости в мьютексе в 1 сценарии потребления 1-го производителя.
В противном случае ключевое слово volatile слишком странно, чтобы его можно было использовать - он не обеспечивает каких-либо гарантий резервирования памяти во время волатильных и энергонезависимых доступов и не обеспечивает каких-либо атомных операций - то есть вы не получаете помощи от компилятора с ключевым словом volatile, кроме кэширования отключенных регистров.