在这方面我是个新手。谁能提供以下内存屏障之间差异的简化解释?
- 窗户
MemoryBarrier();
- 围栏
_mm_mfence();
- 内联汇编
asm volatile ("" : : : "memory");
- 内在的
_ReadWriteBarrier();
如果没有简单的解释,一些好文章或书籍的链接可能会帮助我弄清楚。到目前为止,我只使用其他人编写的对象来包装这些调用就可以了,但我希望比我当前的想法有更好的理解,这基本上符合有不止一种方法可以在幕后实现内存屏障。
Both MemoryBarrier
(MSVC)和_mm_mfence
(由多个编译器支持)提供硬件内存栅栏,防止处理器跨栅栏移动读取和写入。
主要区别在于 MemoryBarrier 具有针对 x86、x64 和 IA64 的特定于平台的实现,其中 _mm_mfence 专门使用mfence
SSE2指令,所以它并不总是可用。
在 x86 和 x64 上 MemoryBarrier 是通过xchg
and lock or
分别,我看到一些声称这比 mfence 更快。然而,我自己的基准测试显示相反的情况,所以显然它在很大程度上取决于处理器型号。
另一个区别是 mfence 还可以用于排序非临时存储/加载(movntq
etc).
海湾合作委员会还有__sync_synchronize
它生成一个硬件围栏。
asm volatile ("" : : : "memory")
在海湾合作委员会和_ReadWriteBarrier
MSVC 中仅提供编译器级别的内存栅栏,防止编译器对内存访问进行重新排序。这意味着处理器仍然可以自由地进行重新排序。
编译器围栏通常与具有某种隐式硬件围栏的操作结合使用。例如。在 x86/x64 上,所有存储都有释放栅栏,并且加载都有获取栅栏,因此在实现加载获取和存储释放时只需要编译器栅栏。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)