Предположим, что на x86 CPU0 и CPU1 работают два потока соответственно. Поток, работающий на CPU0, выполняет следующие команды:
A=1
B=1
Строка кэша, содержащая A, изначально принадлежавшая CPU1, и строка, содержащая B, принадлежащая CPU0.
У меня есть два вопроса:
Если я правильно понимаю, оба хранилища будут помещены в буфер хранилища ЦП. Однако для первого хранилища A=1
кэш CPU1 должен быть недействительным, в то время как второе хранилище B=1
может быть немедленно очищено, поскольку CPU0 владеет строкой кеша, содержащей его. Я знаю, что процессор x86 уважает заказы магазинов. Означает ли это, что B=1
не будет записан в кеш до A=1
?
Предположим, что в CPU1 выполняются следующие команды:
while (B = 0);
печать A
Достаточно ли добавить только lfence между командами while
и print
в CPU1 без добавления sfence между A=1
и B=1
в CPU0, чтобы 1 всегда выводился на x86?
while (B=0);
lfence
print A