使用显式内存围栏是什么意思?
发布于 2008-11-13 10:02:42
为了提高性能,现代CPU经常无序地执行指令,以最大限度地利用可用的芯片(包括存储器读/写)。因为硬件强制执行指令的完整性,所以您在单个执行线程中永远不会注意到这一点。但是,对于多线程或具有易失性内存的环境(例如,内存映射I/O ),这可能会导致不可预知的行为。
内存栅栏/屏障是一类指令,意味着内存读/写按您期望的顺序进行。例如,“全栅栏”意味着在栅栏之前的所有读/写操作先于栅栏之后的那些读/写操作。
注意:内存栅栏是一个硬件概念。在高级语言中,我们习惯于处理互斥锁和信号量-这些可以在低层使用内存栅栏实现,显式使用内存栅栏是不必要的。使用内存屏障需要仔细研究硬件体系结构,并且在设备驱动程序中比应用程序代码中更常见。
CPU的重新排序不同于编译器优化-尽管工件可能是相似的。你需要采取单独的措施来停止编译器重新排序你的指令,如果这可能导致不希望的行为(例如,在C中使用volatile关键字)。
发布于 2008-11-13 10:41:13
将my answer复制到另一个问题What are some tricks that a processor does to optimize code?
最重要的问题是内存访问的重新排序。
在没有内存围栏或序列化指令的情况下,处理器可以自由地重新排序内存访问。一些处理器架构对它们可以重新排序的数量有限制;Alpha是众所周知的最弱的(即可以重新排序最多的)。
在Documentation/memory-barriers.txt上的Linux内核源代码文档中可以找到这个主题的一个很好的解决方案。
大多数情况下,最好使用编译器或标准库中的锁定原语;这些原语经过了良好的测试,应该具有所有必要的内存屏障,并且可能是非常优化的(优化锁定原语是很棘手的;即使是专家有时也会出错)。
发布于 2008-11-13 09:41:38
在我的经验中,它指的是memory barrier,这是一条指令(显式或隐式),用于同步多线程之间的内存访问。
这个问题出现在现代进步式编译器(他们有惊人的自由重新排序指令,但通常对你的线程一无所知)和现代多核CPU的组合中。
这个问题的一个很好的介绍就是"The 'Double-Checked Locking is Broken' Declaration“。对许多人来说,这敲响了警钟,那就是龙的存在。
隐式全内存屏障通常包含在平台线程同步例程中,它覆盖了平台线程同步例程的核心。但是,对于无锁编程和实现自定义的轻量级同步模式,您通常只需要一个屏障,甚至只需要一个单向屏障。
https://stackoverflow.com/questions/286629
复制相似问题