【发布时间】:2012-06-29 07:52:04
【问题描述】:
是否有任何 C 或 C++ 编译器为 volatile 变量实现“积极”内存一致性模型? “积极”一致性模型是指在生成的代码中伴随所有对 volatile 变量的写入以及内存屏障。
AFAIK,这是 IA64 (Itanium) 平台上 C 或 C++ 编译器的习惯行为。 x86呢?是否有编译器可以实现(或可以配置为实现)类似 Itanium 的方法来处理 x86 平台上的 volatile 变量?
编辑:我正在查看 VS 2005 生成的代码(在阅读 cmets 之后),在访问 volatile 变量时,我没有看到任何类似于任何类型的内存屏障的内容。由于 MESIF (Intel) 和 MOESI (AMD) 缓存协议,这对于确保单 CPU 多核 x86 平台上的内存一致性非常好。
但是,这在多 CPU SMP x86 平台上似乎是不够的。 SMP 平台在生成的代码中需要内存屏障,以确保 CPU 之间的内存一致性。我错过了什么?当微软声称他们已经在volatile 变量上具有获取-释放语义时,究竟是什么意思?
【问题讨论】:
-
According to Raymond Chen 你会在 VS2005 和更新版本中得到这种行为
-
@Prætorian : According to the official documentation 也是如此。 ;-]
-
@AndreyT:您是在测试 VC++ 2005 还是 VC++ 2005 SP1? IIRC, VC++ 2005 RTM 有一个错误,
volatile没有预期的语义,这在 SP1 和 VC++ 2008+ 中已修复。 -
此说法不正确:“但是,这在多 CPU SMP x86 平台上是不够的。”无论是否全部在一个芯片中,内核的物理封装都不会改变 x86 中的软件内存排序模型,至少对于 Intel 平台是这样。