在 x86_64 架构上,以下代码是否始终成立:
A=1;B=1;
线程1:存储A=2;商店 B=3;线程2:加载B==3;负载 A==2
有没有 B==3 但 A==1 的可能性?
在 x86_64 架构上,以下代码是否始终成立:
A=1;B=1;
线程1:存储A=2;商店 B=3;线程2:加载B==3;负载 A==2
有没有 B==3 但 A==1 的可能性?
英特尔架构手册第 3A 卷和第 3B 卷的第 8.2.3 章对此主题进行了深入探讨,但是,对于您的情况 ( 8.2.3.7 Stores Are Seen in a Consistent Order by Other Processors
),有严格的顺序,这意味着按照编写顺序观察写入,使在仍然具有旧值的情况下无法B
读取更新的值。A
SFENCE
应该注意的是,在这种情况下,通过使用各种可用的内存隔离指令、、LFENCE
& MFENCE
via _mm_sfence
、_mm_lfence
&来提供显式屏障通常是一个好主意_mm_mfence
。在 x64 下,您还可以选择__faststorefence
(仅限 MSVC)。