concurrency - 什么是内存栅栏?

标签 concurrency memory-fences

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

最佳答案

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

内存栅栏/屏障是一类指令,意味着内存读/写按照您期望的顺序发生。例如,“完整栅栏”意味着栅栏之前的所有读/写都在栅栏之后的读/写之前提交。

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

CPU 重新排序与编译器优化不同 - 尽管结果可能相似。如果这可能导致不良行为(例如在 C 中使用 volatile 关键字),您需要采取单独的措施来阻止编译器对指令重新排序。

关于concurrency - 什么是内存栅栏?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/286629/

相关文章:

asp.net-mvc - 如果 Hangfire 已在运行,则停止启动重复作业

java - java.util.concurrent.Future 的 scala.concurrent.Future 包装器

java - BlockingQueue 提供方法有时不会将项目添加到列表

c++ - OpenMP 原子和非原子读/写在 x86_64 上产生相同的指令

c++ - thread::join 上是否存在具有同步关系的隐式内存屏障?

python - sqlalchemy 中的并发

java - 是否可以使用可见性保证而不是成熟的锁定来以线程安全的方式访问共享状态?

java - 我应该使用什么作为集合的内存屏障?

java - 如何在不使用 sun.misc.Unsafe 的情况下触发完整的内存栅栏?