我如何理解阅读内存障碍和易失性

amagni 发布于 2019-11-10 multithreading 最后更新 2019-11-10 12:10 34 浏览

某些语言提供volatile修饰符,该修饰符被描述为在读取支持变量的内存之前执行“读取内存屏障”。 通常将读内存屏障描述为确保CPU在屏障之前执行请求读取之前执行读屏障之后请求的读取的方式。但是,使用这个定义,似乎仍然可以读取陈旧的值。换句话说,以特定顺序执行读取似乎并不意味着必须查阅主存储器或其他CPU以确保读取的后续值实际上反映了在读取屏障时系统中的最新值或在阅读屏障。 那么,volatile是否确实保证读取最新的值或者只读取(读取的值)至少与屏障之前的读取值一样最新?还是其他一些解释?这个答案的实际含义是什么?

已邀请:

znon

赞同来自:

大多数编程语言中的volatile并不意味着真正的CPU读取内存障碍,而是命令编译器不要通过寄存器中的缓存来优化读取。这意味着读取进程/线程将获得“最终”的值。一种常见的技术是声明一个布尔volatile标志在信号处理程序中设置并在主程序循环中检查。

相比之下,CPU内存屏障可以通过CPU指令直接提供,也可以与某些汇编程序助记符(例如x86中的lock前缀)一起提供,并且例如在与硬件设备通信时使用,其中对内存映射IO寄存器的读写顺序很重要或在多处理环境中同步内存访问。

要回答你的问题 - 不,内存屏障不保证“最新”值,但保证内存访问操作的顺序。这在lock-free编程中至关重要。

Here是CPU内存屏障的引子之一。

yut

赞同来自:

内容太长未翻译