Как AVR и его GCC вспомню, так страшно. Там оптимизатор такие фокусы выделывает. Для AVR вот что https://gcc.gnu.org/wiki/Atomic/GCCMM/Optimizations
есть (вырождается в инструкцию компилятору: __asm__ __volatile__("":::"memory")). Причём оно не препятствует перекидыванию работы с не-volatile переменными за барьер!!! (
http://www.nongnu. …tml#optim_code_reorder) Нарваться можно на космические глюки.
Критическая секция для однозадачной системы с прерываниями: запомнить флаг прерываний, запретить прерывания, потом разрешить. Это практически очень быстро. Для многозадачных систем значительно хуже: переключения контекстов очень медленные, очищается кеш процессора, происходит по сути инверсия приоритетов, про префетч кода цпу даже лучше не вспоминать.