我已阅读有关x64上的内存排序的英特尔文档:http://www.multicoreinfo.com/research/papers/2008/damp08-intel64.pdf。他们说,锁定的指令会导致完全障碍,使处理器可以看到,例如按指定顺序更新。但是没有关于障碍引起的可见性。障碍是否会导致其他处理器立即看到变量更新,或者更新只会按指定的顺序传播到其他处理器但是没有指定的时间?
E.g。
线程1:
flag = true;
MemoryBarrier();
主题2:
MemoryBarrier();
tmp = flag;
如果线程1将在线程2之前执行其代码,那么线程2将始终为flag = true吗?
答案 0 :(得分:3)
障碍保证其他处理器将按指定的顺序查看更新,但不会发生这种情况。
这带来了后续问题,你如何定义"立即"在多处理器系统[1]中,或者如何确保线程1在线程2之前执行?在这种情况下,一个答案是线程1使用诸如xchg之类的原子指令来存储标志变量,然后线程2在标志上旋转,并在它注意到值发生变化时继续(由于方式的原因) x86内存模型工作,线程2可以使用正常的加载指令旋转,存储完成就足够了)
[1]人们可以从相对论物理学的角度来思考它,每个观察者(线程)通过它自己的"光锥"来看事件。因此,必须放弃所有观察者的概念,例如单一的普遍时间。