首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >什么是记忆栅栏?

什么是记忆栅栏?
EN

Stack Overflow用户
提问于 2008-11-13 09:30:33
回答 5查看 49.9K关注 0票数 139

使用显式内存围栏是什么意思?

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2008-11-13 10:02:42

为了提高性能,现代CPU经常无序地执行指令,以最大限度地利用可用的芯片(包括存储器读/写)。因为硬件强制执行指令的完整性,所以您在单个执行线程中永远不会注意到这一点。但是,对于多线程或具有易失性内存的环境(例如,内存映射I/O ),这可能会导致不可预知的行为。

内存栅栏/屏障是一类指令,意味着内存读/写按您期望的顺序进行。例如,“全栅栏”意味着在栅栏之前的所有读/写操作先于栅栏之后的那些读/写操作。

注意:内存栅栏是一个硬件概念。在高级语言中,我们习惯于处理互斥锁和信号量-这些可以在低层使用内存栅栏实现,显式使用内存栅栏是不必要的。使用内存屏障需要仔细研究硬件体系结构,并且在设备驱动程序中比应用程序代码中更常见。

CPU的重新排序不同于编译器优化-尽管工件可能是相似的。你需要采取单独的措施来停止编译器重新排序你的指令,如果这可能导致不希望的行为(例如,在C中使用volatile关键字)。

票数 134
EN

Stack Overflow用户

发布于 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内核源代码文档中可以找到这个主题的一个很好的解决方案。

大多数情况下,最好使用编译器或标准库中的锁定原语;这些原语经过了良好的测试,应该具有所有必要的内存屏障,并且可能是非常优化的(优化锁定原语是很棘手的;即使是专家有时也会出错)。

票数 18
EN

Stack Overflow用户

发布于 2008-11-13 09:41:38

在我的经验中,它指的是memory barrier,这是一条指令(显式或隐式),用于同步多线程之间的内存访问。

这个问题出现在现代进步式编译器(他们有惊人的自由重新排序指令,但通常对你的线程一无所知)和现代多核CPU的组合中。

这个问题的一个很好的介绍就是"The 'Double-Checked Locking is Broken' Declaration“。对许多人来说,这敲响了警钟,那就是龙的存在。

隐式全内存屏障通常包含在平台线程同步例程中,它覆盖了平台线程同步例程的核心。但是,对于无锁编程和实现自定义的轻量级同步模式,您通常只需要一个屏障,甚至只需要一个单向屏障。

票数 10
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/286629

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档