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