заметят ли другие потоки это изменение порядка
Нет, кроме производительности (синхронизация или прямое измерение с помощью счетчиков производительности HW). Или микроархитектурные побочные каналы (например, давление порта ALU для логических ядер, которые совместно используют физическое ядро с Hyperthreading / SMT): один поток может рассчитать сам , чтобы узнать кое-что о том, что выполняет другой аппаратный поток.
Единственный "нормальный" способ для потоков наблюдать что-либо друг о друге - загружать данные, которые хранятся в других потоках.
Даже порядок загрузки виден только косвенно (благодаря тому, как он влияет на то, что другой поток решит сохранить позже).
Насколько я знаю, в x86 нет команды заборов, которая бы препятствовала переупорядочению команд без чтения и без записи.
На процессорах Intel (но не AMD) lfence
делает это . В руководстве Intel говорится, что это , а не , просто деталь реализации. Это действительно гарантировано для будущих микроархитектур.
Справочное руководство по набору инструкций Intel LFENCE :
LFENCE не выполняется до тех пор, пока все предыдущие инструкции не будут выполнены локально, и никакая более поздняя инструкция не начнет выполнение до завершения LFENCE.
(завершено локально = удалено из ядра, вышедшего из строя, т.е. покидает РОБ).
lfence
не особенно полезен в качестве фактического барьера нагрузки, поскольку x86 не допускает слабо упорядоченные нагрузки из памяти WB (только из WC). (Даже movntdqa
или prefetchnta
не могут создавать слабо упорядоченные нагрузки из обычной памяти WB.) Так что в отличие от sfence
, lfence
в принципе никогда не требуется для упорядочения памяти, только для его специальных эффектов как lfence
; rdtsc
. Или для смягчения Призрака, чтобы блокировать спекулятивное выполнение мимо него.
Но в качестве детали реализации, на процессорах Intel, включая, по крайней мере, Skylake, mfence
является барьером для выполнения не по порядку. См. Является ли загрузка и хранение единственными инструкциями, которые переупорядочиваются? для этого и многое другое.