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标准原子。在这样做之前,我想了解一下实际工作。