Да, это возможно, потому что компилятор может переупорядочить эти операторы, как описано в Ответ Питера .
Однако, возможно, вы все еще задаетесь вопросом о другой половине: что может сделать аппаратное обеспечение . При условии, что ваши хранилища окажутся в сборке в порядке, указанном в исходном коде 1 , если прерывание происходит на том же процессоре, на котором выполняется этот код, изнутри прерывания вы увидите все в последовательном порядке. То есть из обработчика прерываний вы никогда не увидите, что второе хранилище завершено, а первое нет. Единственные сценарии, которые вы увидите, не завершены, оба выполнены или первый завершен, а второй нет.
Если задействовано несколько ядер, и прерывание может выполняться на другом ядре, тогда вы просто используете классические сценарии совместного использования потоков, будь то прерывание или нет - и то, что может наблюдать другое ядро, зависит от аппаратной памяти модель. Например, на относительно сильно упорядоченном x86 вы всегда будете наблюдать за магазинами по порядку, где, как на более слабо упорядоченных моделях памяти ARM или POWER, вы сможете увидеть магазины не по порядку.
В целом, однако, ЦП может выполнять все виды переупорядочения: порядок, который вы видите в обработчике прерываний, является особым случаем, когда ЦП восстанавливает вид последовательного выполнения в точке обработки прерывания. То же самое верно для любого случая, когда поток наблюдает за своими собственными хранилищами. Однако, когда хранилища наблюдаются другим потоком - то, что происходит затем, зависит от модели аппаратной памяти, которая сильно варьируется в зависимости от архитектуры.
1 Предполагая также, что они отображаются отдельно - ничто не мешает интеллектуальному компилятору заметить, что вы присваиваете смежные значения в памяти и, следовательно, преобразует два хранилища в одно шире один. Большинство компиляторов могут делать это по крайней мере в некоторых сценариях.