Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/139.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
该内存屏障是否正确实施? 我正在阅读一个遗留C++代码,其中内存屏障定义如下。主要的操作系统是linux和vxworks。编译器是gcc(WindRiver的gcc)_C++_Memory Barriers - Fatal编程技术网

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

该内存屏障是否正确实施? 我正在阅读一个遗留C++代码,其中内存屏障定义如下。主要的操作系统是linux和vxworks。编译器是gcc(WindRiver的gcc),c++,memory-barriers,C++,Memory Barriers,但我不明白无操作操作是如何产生记忆障碍的?或者它只是一个错误实现?这是一个编译器障碍,而不是完整的硬件内存障碍。也就是说,它是一个不透明的调用,编译器无法对其进行优化,但在内存重新排序方面对硬件没有任何影响1。如果所讨论的编译器确实将asm块视为不透明的(例如,gcc asm块有特定的规则来精确定义一个块中可以更改的内容,等等),则可以为此目的正确地定义asm块 如果您知道此代码所针对的硬件具有强大的内存模型,并且从不重新排序内存操作,则可以将其称为完全内存障碍(通常会抑制编译器和硬件的重新排序

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

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

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



1也就是说,如果程序是单线程的,或者机器没有显示出有趣的重新排序(例如,一个简单的顺序、非推测性CPU或单CPU系统),这样的屏障仍然足够。

您可能对内存屏障有错误的解释。你可能认为它是指篱笆。写这封信的人可能是想用它来填充。i、 e.用于填充代码,使其与特定边界对齐。传统代码将其用作在许多您可以清楚分辨的地方设置内存围栏的目的。顺便说一句,nop是如何作为对齐的目的的?它是一种填充物。如果您知道您的代码是15字节,并且需要在添加更多内容之前将其填充到16字节(在x86上),有时人们会插入nop。这里:但是我们不应该使用
asm volatile(“:”内存”)
for compiler barrier?当然,在gcc上,或者在支持gcc asm语法的编译器上,但是我不知道#else案例实际针对的是什么编译器。据我所知,#else案例的目标不是gcc,而是其他一些编译器,它们根本不会查看asm块内部,总是将其插入源代码中的位置。如果按照我的方式,ifs将明确覆盖所有编译器,最后一个ifelse将失败并显示“不支持的编译器”警告。我不确定Wind River的gcc asm语法与gcc有什么不同。您应该检查一下仅仅使用volatile是否足够,或者是否需要使用clobber列表。我将对此进行调查。谢谢FWIW,在我看来,最近的gcc文档表明,仅仅volatile是不够的——正如您所建议的,您需要volatile和clobber列表中的[memory]。如果这段代码是旧代码,它可能在过去工作过,但可能不再工作,等等。当然,如果您的硬件进行任何重新排序,仅编译器的障碍是高度可疑的。因此,这需要“内存”来阻止CPU重新排序,例如读/写?难道没有一个标准的C++命令吗?
#if((KCompilerGNU)||(kCompilerWindRiver))
   #define MEMORY_BARRIER   __asm__ volatile("nop\n");
#else
   #define MEMORY_BARRIER   __asm nop;
#endif