volatile关键字——摸鱼の随笔

简介: 关键字volatile 和 const 一样是类型修饰符,修饰的变量表示可以被某些编译器未知的因素更改(操作系统,硬件,其他线程),编译器不对该数据做优化,特殊地址可访问。

关键字volatile 和 const 一样是类型修饰符,修饰的变量表示可以被某些编译器未知的因素更改(操作系统,硬件,其他线程),编译器不对该数据做优化,特殊地址可访问。


volatile作用🤔

在一般程序运行时,运算一般会交给 CPU 处理,CPU存在运算和控制两个作用,而运算又分为逻辑运算和算术运算。实际场景使用判断时比如 while 语句的条件,就会交给 CPU 逻辑判断,是真返回1继续是真返回1再继续,而 CPU 会默认对数据进行优化,所谓的优化实质上是一种“内存覆盖”,防止优化。

image.png

为了判断时不用去代码中读取,CPU 会每次直接从寄存器里面的读取条件,从代码层面讲其实 CPU 根本就没有再去读取数据,在汇编层面上CPU会自己跳转自己。


但是一但涉及出现另一个逻辑改变了 while 里面条件的值(多线程逻辑是并行的),此时 CPU 依然会在寄存器里面拿到原来条件的值,导致结果异常。volatile 就是防止这种情况进行一个内存的覆盖。


应用场景🤔

以Linux为例:

image.png

分析一下汇编代码


mov:将 pass 放入 exa


test:测试,这里是自己与自己测试(按位与,按位或等)


jne:jump not equals zero,测试结果不为0跳转到相关地址40040d


jmp:跳转到40040d(这里就是自己跳转到自己)


总结一下,volatile就是保持内存可见性!保证每次数据都从内存读取

相关文章
|
8月前
|
算法 程序员 C#
程序员也可以很浪漫!这样的一款表白代码收藏馆项目,即使小白也可以使用,发给你的对象试试!
程序员也可以很浪漫!这样的一款表白代码收藏馆项目,即使小白也可以使用,发给你的对象试试!
118 0
|
1月前
|
C语言
【C语言】return 关键字详解 -《回家的诱惑 ! 》
`return` 关键字在 C 语言中用于终止函数的执行,并将控制权返回给调用者。根据函数的类型,`return` 还可以返回一个值。它是函数控制流中的重要组成部分。
70 2
|
8月前
|
JavaScript 前端开发 Java
万万没想到,'this'关键字的真正威力
万万没想到,'this'关键字的真正威力
64 1
|
存储
用处巨广的操作符,快来学学叭(C语言版)
用处巨广的操作符,快来学学叭(C语言版)
81 1
|
编译器 C++
《C++避坑神器·十八》运算符重载,小白也能看懂
《C++避坑神器·十八》运算符重载,小白也能看懂
54 0
|
算法 C语言
【C语言每日一题】杨氏矩阵(源码以及改进源码)
【C语言每日一题】杨氏矩阵(源码以及改进源码)
85 0
|
JavaScript 前端开发 小程序
程序员过中秋的一百种方式#
程序员过中秋的正确方式:团圆、赏月、还是惨兮兮地加班? 赏月 明月几时有,把酒问青天
224 0
程序员过中秋的一百种方式#
|
存储 安全 Java
彻底理解 volatile 关键字及应用场景,面试必问,小白都能看懂!
彻底理解 volatile 关键字及应用场景,面试必问,小白都能看懂!
592 0
彻底理解 volatile 关键字及应用场景,面试必问,小白都能看懂!
|
存储 算法 编译器
深剖关键字(跑路人笔记2)
深剖关键字(跑路人笔记)
深剖关键字(跑路人笔记2)
|
机器学习/深度学习 JavaScript 算法
☀️苏州程序大白一文解析Java多线程☀️《❤️记得收藏❤️》
☀️苏州程序大白一文解析Java多线程☀️《❤️记得收藏❤️》
157 0
☀️苏州程序大白一文解析Java多线程☀️《❤️记得收藏❤️》