这个内存屏障是否正确实现?

时间:2013-02-04 01:19:29

标签: c++ memory-barriers

我正在阅读传统的C ++代码,其中内存屏障定义如下。主要操作系统是linux和vxworks。编译器是gcc(WindRiver的gcc)。

#if((KCompilerGNU)||(kCompilerWindRiver))
   #define MEMORY_BARRIER   __asm__ volatile("nop\n");
#else
   #define MEMORY_BARRIER   __asm nop;
#endif

但我不知道无操作操作如何产生内存屏障?或者它只是一个错误实现?

1 个答案:

答案 0 :(得分:8)

这是一个编译器障碍,而不是完整的硬件内存障碍。也就是说,它是一个不透明的调用,编译器无法进行优化,但它在内存重新排序 1 方面对硬件没有任何影响。如果有问题的编译器确实将asm块视为不透明(例如,gcc asm块具有用于确定块中可以更改的确切内容的特定规则等),则可以为此目的正确定义。

如果您知道此代码所针对的硬件具有从不重新排序内存操作的强大内存模型,那么将其称为完整内存屏障(通常会抑制编译器和硬件重新排序)可能是合适的。


1 也就是说,在程序是单线程或机器没有表现出有趣的重新排序的情况下,这样的障碍仍然可能足够(例如,一个简单的有序,非推测CPU或单CPU系统。)