美文网首页
C/C++中 volatile变量在并发编程中能做什么?

C/C++中 volatile变量在并发编程中能做什么?

作者: x1wan | 来源:发表于2018-05-17 17:51 被阅读79次

C/C++的volatile关键词通常说有三个特性:易变性;不可优化性;顺序性。但对于并发程序设计来说,要求的是原子性,顺序性,可见性,那么volatile能做到这些么?

1、非可见性

对于volatile修饰的变量的读写,每次都会直接操作内存,也就是每次都是从内存读出来,并且每次都会写入内存,这样当一个线程修改完这个变量并写入内存后,这个变量对其它线程是可见的。但这里要注意一下,cpu在执行写操作的时候是异步的,写store buffer和处理invalidate message都是异步的,所以写volatile变量对其它cpu并不可见,volatile变量无法保证严格的顺序性。

2、非原子性

一般我们的程序读取一个变量后是要用这个变量去做运算的,比如说自增运算,编译成汇编语言就会变成三条语句(1)从内存读到寄存器中(2)对寄存器中的值进行自增操作(3)回写到内存中。在这三条语句之间,其它线程有可能对这个变量进行了修改,导致回写到内存的时候覆盖了其它线程的修改。

3、顺序无保证

编译器通常为了优化性能,有可能对程序重排序,但编译器会保证volatile变量之间的顺序性,然而CPU在执行代码时也会改变顺序,因而volatile变量不能保证执行有序。

4、不可优化性

这里指的不可优化性指编译器不会根据程序上下文将volatile修饰的变量优化掉,这一点对于并发编程是有用的,用volatile修饰变量保证对它的访问不会被优化,所以有些并行程序会用volatile+memory barrier实现可见和有序进而实现lock free。

从以上的分析来看,只用volatile变量没法进行多线程的同步,但volatile+memory barrier是个不错的组合,不会被编译器优化并且可以保证顺序性,常用于lock free算法中。

相关文章

网友评论

      本文标题:C/C++中 volatile变量在并发编程中能做什么?

      本文链接:https://www.haomeiwen.com/subject/xvcidftx.html