Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/163.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++ C++;原子学的记忆障碍_C++_Windows_Visual C++_Memory Barriers - Fatal编程技术网

C++ C++;原子学的记忆障碍

C++ C++;原子学的记忆障碍,c++,windows,visual-c++,memory-barriers,C++,Windows,Visual C++,Memory Barriers,说到这个,我是个新手。有人能简单解释一下以下记忆障碍之间的区别吗 windowsMemoryBarrier() 栅栏_mm_mfence() 内联程序集asm volatile(“:”内存”) 内在的\u读写载体() 如果没有一个简单的解释,一些好文章或好书的链接可能会帮助我弄清楚。到目前为止,我还可以使用其他人编写的对象来包装这些调用,但我希望比我目前的想法有更好的理解,我现在的想法基本上是这样的,即有不止一种方法可以在封面下实现内存屏障。这两种方法都是MemoryBarrier(MSVC

说到这个,我是个新手。有人能简单解释一下以下记忆障碍之间的区别吗

  • windows
    MemoryBarrier()
  • 栅栏
    _mm_mfence()
  • 内联程序集
    asm volatile(“:”内存”)
  • 内在的
    \u读写载体()

如果没有一个简单的解释,一些好文章或好书的链接可能会帮助我弄清楚。到目前为止,我还可以使用其他人编写的对象来包装这些调用,但我希望比我目前的想法有更好的理解,我现在的想法基本上是这样的,即有不止一种方法可以在封面下实现内存屏障。

这两种方法都是
MemoryBarrier
(MSVC)和
\u mm\u mfence
(由多个编译器支持)提供硬件内存围栏,防止处理器跨围栏移动读写

主要区别在于MemoryBarrier具有针对x86、x64和IA64的特定于平台的实现,其中as _mm_mfence专门使用
mfence
SSE2指令,因此并不总是可用

在x86和x64上,MemoryBarrier分别使用
xchg
lock或
实现,我看到一些人声称这比mfence快。但是我自己的基准测试显示了相反的结果,因此显然它在很大程度上取决于处理器型号

另一个区别是,mfence还可用于订购非临时存储/加载(
movntq
etc)

GCC还有
\uuuuu sync\u synchronize
,它生成一个硬件围栏

GCC中的
asm volatile(“:”memory”)
和MSVC中的
\u ReadWriteBarrier
仅提供编译器级内存限制,防止编译器对内存访问进行重新排序。这意味着处理器仍然可以自由进行重新排序


编译器防护栏通常与具有某种隐式硬件防护栏的操作结合使用。例如,在x86/x64上,所有存储都有一个发布防护栏,而加载都有一个获取防护栏,因此在实现加载获取和存储发布时,您只需要一个编译器防护栏。

请参阅我关于防护栏硬件级语义的回答。Wha未提及的是,它们还可防止货物、仓库或货物和仓库的重新排序(取决于围栏)跨越界限,在编译器级别和硬件级别。

你忘记了C++11s
原子线程围栏
这就是它的结果……我们有自己的用于积分类型的原子模板对象,我想切换到C++11标准原子。在这样做之前,我想了解一下实际工作。