Предположим, что на 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);
print A
Достаточно ли добавить только границу между командами , а
и print
в CPU1 без добавления границы между A = 1
и B = 1
в CPU0, чтобы всегда выводить 1 на x86?
while (B=0);
lfence
print A