Для повышения производительности современные процессоры часто выполняют инструкции не по порядку, чтобы максимально использовать доступный кремний (включая чтение / запись памяти). Поскольку аппаратное обеспечение обеспечивает целостность инструкций, вы никогда не заметите это в одном потоке выполнения. Тем не менее, для нескольких потоков или сред с энергозависимой памятью (например, отображение ввода-вывода в памяти) это может привести к непредсказуемому поведению.
Ограничение / барьер памяти - это класс инструкций, которые означают, что чтение / запись в память происходит в том порядке, в котором вы ожидаете. Например, «полный забор» означает, что все операции чтения / записи перед забором выполняются перед тем, что за забором.
Примечание. Ограждения памяти представляют собой аппаратную концепцию. В языках более высокого уровня мы привыкли иметь дело с мьютексами и семафорами - они вполне могут быть реализованы с использованием ограждений памяти на низком уровне, и явное использование барьеров памяти не требуется. Использование барьеров памяти требует тщательного изучения архитектуры оборудования и чаще встречается в драйверах устройств, чем в коде приложения.
Переупорядочение ЦП отличается от оптимизации компилятора - хотя артефакты могут быть похожими. Вам нужно принять отдельные меры, чтобы остановить переупорядочивание ваших инструкций компилятором, если это может вызвать нежелательное поведение (например, использование ключевого слова volatile в C).