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

时间:2009-11-24 02:39:57

标签: multithreading volatile memory-barriers

某些语言提供了volatile修饰符,在读取支持变量的内存之前,它被描述为执行“读取内存屏障”。

读取内存屏障通常被描述为一种方法,用于确保CPU在屏障之后执行读取之前执行读取之前请求的读取。但是,使用此定义,似乎仍然可以读取过时值。换句话说,以特定顺序执行读取似乎并不意味着必须查询主存储器或其他CPU以确保读取的后续值实际上反映了读取屏障时系统中的最新值或随后写入阅读障碍。

那么,volatile是否真的保证读取最新值或者只是(喘气!)读取的值至少与屏障之前的读取一样是最新的?还是其他一些解释?这个答案有什么实际意义?

2 个答案:

答案 0 :(得分:108)

答案 1 :(得分:9)

在大多数编程语言中,

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

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

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

Here是CPU内存障碍的引用之一。