1

我已经阅读了有关 x64 上的内存排序的英特尔文档:http: //www.multicoreinfo.com/research/papers/2008/damp08-intel64.pdf。他们说锁定指令会导致完全障碍,从而使处理器可以看到例如指定的更新命令。但是,障碍引起的能见度并没有什么。障碍是否会导致其他处理器将立即看到变量的更新,或者更新可能只会以指定的顺序传播到其他处理器但没有指定的时间?

例如

线程1:

flag = true;
MemoryBarrier();

线程 2:

MemoryBarrier();
tmp = flag;

如果线程 1 将在线程 2 之前执行其代码,线程 2 是否总是 flag=true?

4

1 回答 1

3

屏障保证其他处理器将按照指定的顺序看到更新,但不是在这种情况发生时。

这带来了后续问题,在多处理器系统中如何定义“立即”[1],或者如何确保线程 1 在线程 2 之前执行?在这种情况下,一个答案是线程 1 使用诸如 xchg 之类的原子指令来存储标志变量,然后线程 2 在标志上旋转,并在它注意到值更改时继续(由于方式x86 内存模型有效,线程 2 可以使用正常的加载指令旋转,使用原子完成存储就足够了)

[1] 可以从相对论物理学的角度来思考,每个观察者(线程)通过自己的“光锥”看到事件。因此,必须为所有观察者放弃诸如单一通用时间之类的概念。

于 2012-08-23T09:03:47.733 回答