6

假设有两个线程分别在 x86 CPU0 和 CPU1 上运行。CPU0 上运行的线程执行以下命令:

A=1
B=1

包含 CPU1 最初拥有的 A 和包含 CPU0 拥有的 B 的高速缓存行。

我有两个问题:

  1. 如果我理解正确,两个存储都将被放入 CPU 的存储缓冲区。但是,对于第一个存储A=1,CPU1 的缓存必须无效,而第二个存储B=1可以立即刷新,因为 CPU0 拥有包含它的缓存行。我知道 x86 CPU 尊重商店订单。这是否意味着B=1之前不会写入缓存A=1

  2. 假设在 CPU1 中执行了以下命令:

而(B=0);
打印一个

while在 CPU1 中的和print命令之间仅添加 lfence而不在 CPU0 之间A=1和中添加 sfenceB=1以使 1 始终在 x86 上打印就足够了吗?

while (B=0);
lfence
print A
4

1 回答 1

8

在 x86 中,所有处理器以相同的顺序观察单个处理器的写入。在您的示例中无需围栏,在 x86 上的任何普通程序中也无需围栏。你的程序:

while(B==0);  // wait for B == 1 to become globally observable
print A;      // now, A will always be 1 here

缓存中究竟发生了什么是特定于模型的。缓存中可以发生各种诡计和推测行为,但可观察到的行为始终遵循规则。

请参阅英特尔系统编程指南第 3 卷第 8.2.2 节。有关内存排序的详细信息。

于 2012-01-16T16:56:22.197 回答