我想知道的是,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
的行为不同,那么互斥量如何帮助您查看最新值?