关键字volatile 和 const 一样是类型修饰符,修饰的变量表示可以被某些编译器未知的因素更改(操作系统,硬件,其他线程),编译器不对该数据做优化,特殊地址可访问。
volatile作用🤔
在一般程序运行时,运算一般会交给 CPU 处理,CPU存在运算和控制两个作用,而运算又分为逻辑运算和算术运算。实际场景使用判断时比如 while 语句的条件,就会交给 CPU 逻辑判断,是真返回1继续是真返回1再继续,而 CPU 会默认对数据进行优化,所谓的优化实质上是一种“内存覆盖”,防止优化。
为了判断时不用去代码中读取,CPU 会每次直接从寄存器里面的读取条件,从代码层面讲其实 CPU 根本就没有再去读取数据,在汇编层面上CPU会自己跳转自己。
但是一但涉及出现另一个逻辑改变了 while 里面条件的值(多线程逻辑是并行的),此时 CPU 依然会在寄存器里面拿到原来条件的值,导致结果异常。volatile 就是防止这种情况进行一个内存的覆盖。
应用场景🤔
以Linux为例:
分析一下汇编代码
mov:将 pass 放入 exa
test:测试,这里是自己与自己测试(按位与,按位或等)
jne:jump not equals zero,测试结果不为0跳转到相关地址40040d
jmp:跳转到40040d(这里就是自己跳转到自己)
总结一下,volatile就是保持内存可见性!保证每次数据都从内存读取