在x86_64架构上,以下代码是否始终保持:
A = 1; B = 1;
Thread1:存储A = 2;商店B = 3; Thread2:加载B == 3;加载A == 2
是否存在B == 3但A == 1 ??
的可能性答案 0 :(得分:3)
英特尔体系结构手册的第3A和3B卷第8.2.3节深入讨论了这个主题,但是,对于您的情况(8.2.3.7 Stores Are Seen in a Consistent Order by Other Processors
),有严格的排序,这意味着在它们的编制顺序,使B
无法在A
仍具有旧值时读取更新后的值。
应该注意的是,通过使用各种可用的内存防护指令,SFENCE
,LFENCE
&可以在这种情况下提供明确的障碍通常是一个好主意。 MFENCE
来自_mm_sfence
,_mm_lfence
& _mm_mfence
。在x64下,您还可以选择__faststorefence
(仅限MSVC)。