Multithreading 内存桶和可见性-x64

Multithreading 内存桶和可见性-x64,multithreading,synchronization,64-bit,lockless,Multithreading,Synchronization,64 Bit,Lockless,我已经阅读了有关x64上内存排序的英特尔文档:。他们说,锁定的指令会造成完全的障碍,使处理器看到指定顺序的更新。但障碍物造成的能见度却毫无意义。障碍是否会导致其他处理器立即看到变量的更新,或者更新只会以指定的顺序传播到其他处理器,但不会在指定的时间内传播 例如 线程1: flag = true; MemoryBarrier(); 线程2: MemoryBarrier(); tmp = flag; 如果线程1将在线程2之前执行其代码,那么线程2是否总是标记为true?这些障碍保证其他处理器将以

我已经阅读了有关x64上内存排序的英特尔文档:。他们说,锁定的指令会造成完全的障碍,使处理器看到指定顺序的更新。但障碍物造成的能见度却毫无意义。障碍是否会导致其他处理器立即看到变量的更新,或者更新只会以指定的顺序传播到其他处理器,但不会在指定的时间内传播

例如

线程1:

flag = true;
MemoryBarrier();
线程2:

MemoryBarrier();
tmp = flag;

如果线程1将在线程2之前执行其代码,那么线程2是否总是标记为true?

这些障碍保证其他处理器将以指定的顺序看到更新,但在这种情况下不会

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


[1] 我们可以用相对论物理学的角度来思考它,每个观察者(线程)都通过自己的“光锥”来观察事件。因此,我们必须放弃像所有观察者都有一个宇宙时间这样的概念。

是的,这个类比真的很聪明。+1:)