x86_64内存重新排序

时间:2013-03-23 05:37:01

标签: concurrency x86-64 memory-model

在x86_64架构上,以下代码是否始终保持:

A = 1; B = 1;

Thread1:存储A = 2;商店B = 3; Thread2:加载B == 3;加载A == 2

是否存在B == 3但A == 1 ??

的可能性

1 个答案:

答案 0 :(得分:3)

英特尔体系结构手册的第3A和3B卷第8.2.3节深入讨论了这个主题,但是,对于您的情况(8.2.3.7 Stores Are Seen in a Consistent Order by Other Processors),有严格的排序,这意味着在它们的编制顺序,使B无法在A仍具有旧值时读取更新后的值。

应该注意的是,通过使用各种可用的内存防护指令,SFENCELFENCE&可以在这种情况下提供明确的障碍通常是一个好主意。 MFENCE来自_mm_sfence_mm_lfence& _mm_mfence。在x64下,您还可以选择__faststorefence(仅限MSVC)。