假设x86 CPU0和CPU1上分别运行了两个线程。在CPU0上运行的线程执行以下命令:
A=1
B=1
包含A最初由CPU1拥有并且包含由CPU0拥有的B的高速缓存行。
我有两个问题:
如果我理解正确,两个存储都将被放入CPU的存储缓冲区。但是,对于第一个存储A=1
,CPU1的高速缓存必须无效,而第二个存储B=1
可以立即刷新,因为CPU0拥有包含它的高速缓存行。我知道x86 CPU尊重商店订单。这是否意味着B=1
之前不会将A=1
写入缓存?
假设在CPU1中执行以下命令:
while(B = 0);
打印A
仅在CPU1中的while
和print
命令之间添加lfence就足够了,而不在CPU0中的A=1
和B=1
之间添加一个sfence,以便始终打印出1在x86上?
while (B=0);
lfence
print A
答案 0 :(得分:8)
在x86中,所有处理器都以相同的顺序观察单个处理器的写入。不需要在你的例子中,也不需要在x86上的任何正常程序中。你的计划:
while(B==0); // wait for B == 1 to become globally observable
print A; // now, A will always be 1 here
缓存中究竟发生了什么特定于模型。缓存中可能会出现各种技巧和推测行为,但 observable 行为始终遵循规则。
请参阅“Intel系统编程指南”第3卷第8.2.2节。有关内存排序的详细信息。