x86-64 MFENCE全局可见性是否约束其他核心后续加载指令?
场景一:双线程对称Store-Load序列
初始状态X=Y=0时的双线程代码:
T1: T2: STORE X = 1 STORE Y = 1 MFENCE MFENCE LOAD Y LOAD X
你的理解是正确的:两个LOAD指令不可能都读到0。
MFENCE作为全序列化屏障,英特尔官方手册明确说明:
This serializing operation guarantees that every load and store instruction that precedes the MFENCE instruction in program order becomes globally visible before any load or store instruction that follows the MFENCE instruction.
翻译为:
该序列化操作保证,程序顺序中MFENCE指令之前的所有加载、存储指令,会在MFENCE之后的任何加载、存储指令执行前,完成全局可见。
对T1来说,STORE X=1必须在LOAD Y前全局可见;对T2来说,STORE Y=1必须在LOAD X前全局可见。如果两个LOAD都读0,意味着T1没看到T2的存储、T2也没看到T1的存储,这直接违反MFENCE的约束,因此不可能发生。
场景二:MFENCE完成时序与跨线程LOAD的可见性
简化后的场景代码:
T1: T2: STORE X = 1 LOAD X MFENCE LOAD Y
核心问题
假设T1的MFENCE在T2开始执行LOAD X之前已经实时完成,能否确定T2的LOAD X必然读到X=1?
解答
在这个特定时序场景下,T2的LOAD X必然能读到X=1,推理完全有效:
- MFENCE的核心作用之一是强制刷新本线程的存储缓冲区,确保所有在它之前的存储操作完成全局可见性——也就是这些存储的结果已经同步到所有核心可观测的缓存一致性域中。
- 当T1的MFENCE先于T2的LOAD X完成时,
STORE X=1已经对T2所在核心可见。x86-64的强内存模型保证,已全局可见的存储,后续的LOAD指令必然能读取到最新值,不存在“MFENCE完成但存储未同步”的情况。
关于跨线程实时顺序的推理有效性:x86-64是强顺序内存模型,在明确的实时时序约束下(如本场景中MFENCE先于对方LOAD执行完成),这类推理是完全成立的。只有当线程间时序没有明确同步机制约束时,才会出现可见性延迟或重排序的可能。
内容的提问来源于stack exchange,提问作者RSIMB GO

