当前位置: 首页 > article >正文

关键字:volatile

1.铺垫

1.1volatile是一个非常冷门的关键字,我们在学习C语言的时候,基本不会用到他;如果想用C语言做更多的项目和代码;必须会使用他;

2.volatile

volatile:易变的,不稳定的;

先举例:

内存中,有一个变量 int flag=1;在执行代码时,CPU先将变量读取到寄存器中;然后进行运算(算数运算和逻辑运算);

CPU不断地进行while语句逻辑判断,正常的程序是:CPU将数据从内存(栈或其他)中拿到寄存器处,进行逻辑判断(while判断),判断后,重新将f数据放回内存;第二次运行执行逻辑判断(while()判断),依旧如此进行;

因为while语句中,并没有对flag进行修改,当在编译时,编译器可能自动优化代码,CPU在执行while判断时,不会再从对应的内存中读取数据,而是把这个flag数据直接拿到对应的寄存器中,不断的进行CPU检测;直接检测寄存器的值就可以了;——相对应的是,内存的变量永远不会被读取了,而是就近似的读取离cpu最近的寄存器(此情况是一种内存被覆盖的情况,cpu不再向内存中读取数据,而是向寄存器中读取数据);

此程序在一个执行流下没有问题;可是如果是在多线程的情况下,并发访问flag;另一个线程将flag(flag=0)设置成零,来控制这个线程的运行,而CPU因为编译器的优化,永远都是向寄存器中读取数据;所以cpu读到的条件永远为真,内存中的数据已经置零;会造成很多问题;

矫正:上面所说的是,是为了理解,cpu在读数据时,直接从寄存器中读取;实际上,编译器在做优化的时候甚至不需要从寄存器中读数据了,这个死循环,直接从代码层面上甚至都不读取数据,直接将代码在汇编层面上,设置成自己跳转自己,根本就不读取数据了(这个不读取数据和内存覆盖是等价的);因为此while语句里没有执行代码,使用gcc优化完成后,只判断一次,往后直接成死循环了,连判断都不判断了;

int flag=1;

while(flag){        //CPU要不断进行逻辑判断逻辑运算;

}

 解决:这个关键字volatile是不需要编译器优化,达到稳定访问内存的目的;

volatile int pass=1;        //在定义pass的时候就加上volatile就行;


http://www.kler.cn/news/334049.html

相关文章:

  • 数据库概述(1)
  • easypoi, fastpoi快速导出xlsx,导出多sheet的xlsx
  • mysql-索引笔记
  • 有关自连接表的统一封装
  • 基于定制开发与2+1链动模式的商城小程序搭建策略
  • 招联2025校招内推倒计时
  • 如何在电脑上浏览手机界面
  • 【部署项目】禹神:前端项目部署上线笔记
  • 设计模式-模版方法模式
  • No.4 笔记 | 探索网络安全:揭开Web世界的隐秘防线
  • 如何在每台设备上恢复已删除的照片
  • 最新版的dubbo服务调用(用nacos做注册中心用)
  • 【解决办法】git clone报错unable to access ‘xxx‘: SSL certificate problem:
  • rtmp协议转websocketflv的去队列积压
  • 【2024年最新】基于Spring Boot+vue的旅游管理系统lw+ppt
  • 从一到无穷大 #36 Lindorm 宽表:东西互联,南北互联,AI一体
  • 真正的Open AI ——LLaMA颠覆开源大模型
  • LeetCode hot100---二叉树专题(C++语言)
  • 《python语言程序设计》2018版第8章19题几何Rectangle2D类(下)-头疼的几何和数学
  • 从Rally到Atlassian Cloud:思科Cisco实现云迁移的技术挑战与解决方案