【发布时间】:2013-03-23 05:37:00
【问题描述】:
在 x86_64 架构上,以下代码是否会一直保持:
A=1;B=1;
Thread1 : 存储 A=2;商店 B=3; 线程2:加载B==3;加载 A==2
是否存在 B==3 但 A==1 的可能性??
【问题讨论】:
标签: concurrency x86-64 memory-model
在 x86_64 架构上,以下代码是否会一直保持:
A=1;B=1;
Thread1 : 存储 A=2;商店 B=3; 线程2:加载B==3;加载 A==2
是否存在 B==3 但 A==1 的可能性??
【问题讨论】:
标签: concurrency x86-64 memory-model
英特尔架构手册第 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)。
【讨论】:
8.2.3.2 Neither Loads Nor Stores Are Reordered with Like Operations 的用武之地,它的示例准确地描述了您的场景:The disallowed return values could be exhibited only if processor 0’s two stores are reordered (with the two loads occurring between them) or if processor 1’s two loads are reordered (with the two stores occurring between them). 在这种情况下,您需要使用我提到的原子屏障或内存屏障来确保总顺序。