C和C++;带“的编译器”;“侵略性”;易变语义 P>有没有C或C++编译器在执行代码“< Value变量”的“攻击性”内存一致性模型?所谓“积极”一致性模型,我指的是在生成的代码中伴随着对volatile变量的所有写入,并带有内存障碍 AFIK,这是IA64(IANTIAL)平台上C或C++编译器的习惯行为。x86呢?在x86平台上,是否有一个编译器实现(或可以配置为实现)类似安腾的方法来处理volatile变量

C和C++;带“的编译器”;“侵略性”;易变语义 P>有没有C或C++编译器在执行代码“< Value变量”的“攻击性”内存一致性模型?所谓“积极”一致性模型,我指的是在生成的代码中伴随着对volatile变量的所有写入,并带有内存障碍 AFIK,这是IA64(IANTIAL)平台上C或C++编译器的习惯行为。x86呢?在x86平台上,是否有一个编译器实现(或可以配置为实现)类似安腾的方法来处理volatile变量,c++,c,x86,volatile,smp,C++,C,X86,Volatile,Smp,编辑:我正在查看VS2005生成的代码(在阅读注释后),在访问volatile变量时,我没有看到任何类似于任何内存障碍的内容。由于MESIF(英特尔)和MOESI(AMD)缓存协议,这对于确保单CPU多核x86平台上的内存一致性非常好 但是,在多CPU SMP x86平台上,这似乎是不够的。SMP平台需要在生成的代码中设置内存屏障,以确保CPU之间的内存一致性。我错过了什么?当微软声称他们已经在volatile变量上拥有acquire release语义时,他们的确切意思是什么?应该注意的是,x

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


但是,在多CPU SMP x86平台上,这似乎是不够的。SMP平台需要在生成的代码中设置内存屏障,以确保CPU之间的内存一致性。我错过了什么?当微软声称他们已经在
volatile
变量上拥有acquire release语义时,他们的确切意思是什么?

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


MSVC编译器将确保不会使用易失性加载对加载进行重新排序,也不会使用易失性存储对存储进行重新排序(当然,我现在谈论的是对加载和存储指令进行重新排序),因此,可以分别保证易失性加载和存储的获取和释放语义。

使用VS2005和newer@Pr都灵:也是@你是在测试VC++2005还是VC++2005SP1?IIRC,VC++2005 RTM有一个bug,
volatile
没有预期的语义,这在SP1和VC++2008+中得到了修复。相关:这句话不正确:“但是,这在多CPU SMP x86平台上是不够的。”无论是否都在一个芯片中,内核的物理封装不会改变x86中的软件内存排序模式,至少在英特尔平台上是这样。即使在多CPU情况下(与单CPU多核情况相反)也是如此吗?@AndreyT,外部总线看到加载的顺序与加载指令的顺序相同。商店也是如此。正如您所指出的,缓存协议确保了一致性。换句话说,如果CPU1执行一个存储S和CPU2看到它的负载L的存储,那么在AndreyT之后,CPU2加载的所有的存储都将在S.SpU1之前看到,而我的朋友是获取/释放语义:),我不想咆哮,但是我希望C++委员会已经做出了“易失性的获取/释放语义”。保证标准,而不是提出
@avakar:我没有
提供了比acquire/release更有力的保证,例如顺序一致性,
volatile
还有其他用途-它不应该用于线程。@avakar这难道不意味着在缓存一致性较弱且使用volatile访问控制寄存器的设备上运行的程序的性能会受到影响吗?即使实际上不需要,也需要时间来保持缓存一致性吗?不混合这两组语义似乎是合理的。