volatile 意思就是多变的,那什么时候才用volatile 呢
个人觉的在嵌入式的工程中或者涉及硬件编程的时候,变量的使用需要,因为很多都是在寄存器中取值。看到网上很多是多线程下最好用这个。
C/C++多线程编程中不要使用volatile。
(注:这里的意思指的是指望volatile解决多线程竞争问题是有很大风险的,除非所用的环境系统不可靠才会为了保险加上volatile,或者是从极限效率考虑来实现很底层的接口。这要求编写者对程序逻辑走向很清楚才行,不然就会出错)
C++11标准中明确指出解决多线程的数据竞争问题应该使用原子操作或者互斥锁。
C和C++中的volatile并不是用来解决多线程竞争问题的,而是用来修饰一些因为程序
不可控因素导致变化的变量,比如访问底层硬件设备的变量,以提醒编译器不要对该 变量的访问擅自进行优化。
简单的来说,对访问共享数据的代码块加锁,已经足够保证数据访问的同步性,再加 volatile完全是多此一举。如果光对共享变量使用volatile修饰而在可能存在竞争的
操作中不加锁或使用原子操作对解决多线程竞争没有任何卵用,
volatile并不能保证操作的原子性,在读取、写入变量的过程中仍然可能被其他线程打断导致意外结果发生。
如果项目中编译的时候选择了不优化,是不是就可以不用volatile 。
这里,做下记录,以备忘记。