lock xchg与mfence具有相同的行为吗?

时间:2016-11-03 18:59:41

标签: multithreading assembly x86 cpu-architecture memory-barriers

我想知道的是,lock xchg是否会与mfence具有类似的行为,从一个线程的角度来访问其他正在变异的内存位置(让我们随便说)线程。它能保证我获得最新的价值吗?之后的内存读/写指令?

我混淆的原因是:

  

8.2.2“读取或写入不能通过I / O指令,锁定指令或序列化指令重新排序。”

     

-Intel 64 Developers Manual Vol。 3

这是否适用于各个线程?

mfence州:

  

对MFENCE指令之前发出的所有内存加载和存储到内存指令执行序列化操作。此序列化操作保证在MFENCE指令之前的任何加载或存储指令全局可见之前,在程序顺序之前的每条加载和存储指令都是全局可见的。 MFENCE指令按照所有加载和存储指令,其他MFENCE指令,任何SFENCE和LFENCE指令以及任何序列化指令(例如CPUID指令)进行排序。

     

-Intel 64 Developers Manual Vol 3A

这个听起来像更强大的保证。听起来mfence几乎正在刷写写缓冲区,或者至少延伸到写缓冲区和其他内核以确保我未来的加载/存储是最新的。

当基准标记时,两个指令都需要约100个循环才能完成。所以我无论如何都看不出那么大的差异。

主要是我很困惑。我的指令基于互斥体中使用的lock,但是这些指令不包含内存栅栏。然后我看到 lock free 编程,它使用内存栅栏但没有锁。我知道AMD64有一个非常强大的内存模型,但过时的值可以在缓存中持续存在。如果lock的行为与mfence的行为不同,那么互斥量如何帮助您查看最新值?

0 个答案:

没有答案
相关问题