4

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

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

但是我看不到无操作操作如何产生内存屏障?或者这只是一个错误的实现?

4

1 回答 1

8

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

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


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

于 2013-02-04T01:28:36.687 回答