具有"积极"易失性语义的C和C++编译器

AnT*_*AnT 11 c c++ x86 volatile smp

是否有任何C或C++编译器为volatile变量实现"积极"的内存一致性模型?通过"积极"一致性模型,我的意思是伴随所有写入volatile生成代码中具有内存障碍的变量.

AFAIK,这是IA64(Itanium)平台上C或C++编译器的习惯行为.x86怎么样?是否有一个编译器实现(或可以配置实现)类似于Itanium的方法来处理volatilex86平台上的变量?

编辑:我正在查看VS 2005生成的代码(在阅读注释后),并且在访问volatile变量时我没有看到任何类似于任何内存屏障的内容.由于MESIF(英特尔)和MOESI(AMD)缓存协议,这对于确保单CPU多核x86平台上的内存一致性非常好.

但是,在多CPU SMP x86平台上,这似乎不够.SMP平台在生成的代码中需要内存屏障,以确保CPU之间的内存一致性.我错过了什么?当微软宣称他们已经拥有volatile变量的获取释放语义时,他究竟是什么意思呢?

ava*_*kar 2

应该注意的是,x86 CPU 既不会对负载与其他负载进行重新排序,也不会对存储与其他存储进行重新排序。因此,不需要明确的障碍。

MSVC 编译器将确保加载不会使用 易失性加载重新排序,并且存储不会使用易失性存储重新排序(当然,我现在正在讨论重新排序加载和存储指令),从而分别保证易失性加载和存储的获取和释放语义。

  • @阿瓦卡:我不。`<atomic>` 提供比获取/释放更强的保证,例如顺序一致性,而 `volatile` 有其他用途 - 它*不*应该用于线程。 (4认同)
  • @avakar 这是否意味着在缓存一致性较弱的设备上运行的程序并使用易失性访问控制寄存器会导致性能下降?即使实际上不需要,是否也需要花费时间来维护缓存一致性?不混合两组语义似乎是合理的。 (2认同)