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