这个内存屏障实现正确吗

Is this memory barrier implemented correctly?

本文关键字:实现 内存      更新时间:2023-10-16

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

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

但我不明白无操作是如何产生记忆屏障的?或者它只是一个故障实现?

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

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


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