• 本文大部分来自于:http://witmax.cn/volatile.html

    我怕链接会失效,故转载此篇文章。。。

    volatile关键字是一种类型修饰符,用它声明的类型变量,编译器对访问该变量的代码就不再进行优化,从而可以提供对特殊地址的稳定访问。精确地说就是,优化器在用到这个变量时必须每次都小心地重新读取这个变量的值,而不是使用保存在寄存器里的备份。

    其中关键在于两个地方:     
     
    1. 编译器的优化

    在本次线程内, 当读取一个变量时,为提高存取速度,编译器优化时有时会先把变量读取到一个寄存器中;以后,再取变量值时,就直接从寄存器中取值;

    当变量值在本线程里改变时,会同时把变量的新值copy到该寄存器中,以便保持一致

    当变量在因别的线程等而改变了值,该寄存器的值不会相应改变,从而造成应用程序读取的值和实际的变量值不一致

    当该寄存器在因别的线程等而改变了值,原变量的值不会改变,从而造成应用程序读取的值和实际的变量值不一致

    2. 在什么情况下会用到

    • 并行设备的硬件寄存器(如:状态寄存器)
    • 一个中断服务子程序中会访问到的非自动变量(Non-automatic variables)
    • 多线程应用中被几个任务共享的变量

    再附一篇写得不错的介绍文章:

    用volatile关键字防止变量被编译器优化

    volatile 是在C、C++、Java等中语言中的一种修饰关键字。

    这个关键字在嵌入式系统中,是一个非常重要的一个使用。尽管在一般的Application中,可能很多人都不需要使用这个。但是在单片机中,如果不熟悉这个关键字,很有可能产生想像不到的意外。

    那么,我就来谈谈Volatile的意义--

    volatile在ANSI C(C89)以后的C标准规格和const一起被包含在内。在标准C中,这些关键字是必定存在的。

    关于volatile的意义,根据标准C的定义、volatile的目的是,避免进行默认的优化处理.比如说对于编译器优化的功能,如果从编译器看来,有些多余的代码的话,编译器就会启动优化程序,并删除一些代码,但是这在嵌入式系统中很有可能是关键性的处理,必须不能保证被编译器删掉,所以提供了Volitile来声明,告诉编译器无论如何都不要删掉我。

    volatile:易变的,不稳定的。。

    例子一:

    volatile a;(a是用volatile修饰后)
    a=1;
    a=2;
    a=3;
    a=4;
     volatile禁止编译器优化,编译后将产生4条代码。如果没用volatile修饰,编译器会优化上述代码,并认为只有最后1条是有效的,编译后将只产生1条代码,即最后一行。如果中间有其它代码,就不一定了。

    例子二:

    比如说下面条件的一段代码

    extern int event_flagvoid poll_event()
    {
    while (event_flag == 0) {/* 不操作event_flag */....
    }
    ....
    }

    我们不再循环中改变这里的event_flag的值,这样的话,event_flag 看起来就像是多余的,因此单片机编译器可能把此程序看为下段程序。

    void poll_event()
    {
    if (event_flag == 0) {while (1) {/* 不对event_flag操作 */....}
    }
    ....
    }
    • 对于一般的编译器,一般都会把程序优化成上述程序。这样的优化确实可以提高代码速度,比如while循环中不再需要对条件的判断,所以很快,但是这是正确的吗?

      对于单线程的程序,这是没有问题的,因为event_flag 就永远不会改变,但是对于多线程程序,RTOS的多任务处理的话,event_flag 的值可能被其他线程改变,这样问题就来了,因为被优化的代码并不具备对用event_flag 变化的能力。因此导致错误的意想不到的结果,如果此代码在ECU上执行的话,那我们的小命可就有可能没了。。。。

      为了避免这种情况,我们使用volatile关键字来防止程序被编译器优化。

volatile关键字的作用:防止变量被编译器优化相关推荐

  1. volatile关键字的作用、原理

    在只有双重检查锁,没有volatile的懒加载单例模式中,由于指令重排序的问题,我确实不会拿到两个不同的单例了,但我会拿到"半个"单例. 而发挥神奇作用的volatile,可以当之 ...

  2. [实验]-从汇编代码来看volatile关键字的作用

    ★★★ 个人博客导读首页-点击此处 ★★★ 环境aarch64的交叉编译器 我们将C语言翻译成汇编代码,来看volatile关键字的作用 我们先看一段C语言代码 void udelay(uint64_ ...

  3. 24.volatile关键字的作用、volatile原理、可见性、内存屏障、volatile性能、transient

    24.volatile关键字的作用 24.1.volatile原理 24.2.可见性 24.3.内存屏障 24.4.volatile性能 25.transient 24.volatile关键字的作用 ...

  4. 【说一千道一万】volatile关键字的作用和synchronized的关系

    [说一千道一万]volatile关键字的作用和synchronized的关系 volatile这个关键字在面试的时候通常会拿出来跟synchronized作比较,这也是比较基础的面试题目,这里自己总结 ...

  5. 一文搞懂Volatile关键字的作用

    前言 Volatile关键字的作用主要有如下两个: 1.线程的可见性:当一个线程修改一个共享变量时,另外一个线程能读到这个修改的值. 2. 顺序一致性:禁止指令重排序. 一.线程可见性 我们先通过一个 ...

  6. java volatile关键字的作用_java volatile关键字作用及使用场景详解

    1. volatile关键字的作用:保证了变量的可见性(visibility).被volatile关键字修饰的变量,如果值发生了变更,其他线程立马可见,避免出现脏读的现象.如以下代码片段,isShut ...

  7. 深入理解并发内存模型||JMM与内存屏障||多核并发缓存架构 ||JMM内存模型||volatile 关键字的作用 ||JMM 数据原子操作||JMM缓存不一致的问题

    深入理解并发内存模型||JMM与内存屏障 多核并发缓存架构 JMM内存模型 volatile 关键字的作用 JMM 数据原子操作 JMM缓存不一致的问题

  8. c语言中volatile关键字的作用

    读文章之前 可以先看一下<程序员的自我修养 >第28页 过度优化. volatile 提醒编译器它后面所定义的变量随时都有可能改变,因此编译后的程序每次需要存储或读取这个变量的时候,都会直 ...

  9. C语言volatile关键字的作用

    一.前言 1.编译器优化介绍: 由于内存访问速度远不及CPU处理速度,为提高机器整体性能,在硬件上引入硬件告诉缓存Cache,加速对内存的访问.另外在现代CPU中指令的执行并不一定严格按照顺序执行,没 ...

最新文章

  1. oracle与db2的应用场景区别,db2和oracle语句区别
  2. (转)Spring中ThreadLocal的认识
  3. aspx 追加html标签,ASP.NET动态增加HTML元素的方法实例小结
  4. Tensorflow: 保存和复原模型(save and restore)
  5. amd cpu 不兼容centos5.5_AMD放弃兼容性?这事简单也不简单
  6. 字节跳动专家会_字节跳动招聘直播策略运营专家/经理/海外财务AR BP,ACCA优先...
  7. nodejs 实现文件拷贝
  8. 苹果手机数据线充不了电_手机充电器充不了电?其实4招就能解决
  9. (王道408考研操作系统)第二章进程管理-第四节3:死锁处理策略之检测和解除
  10. jquery插件实现分页
  11. 钉钉考勤接口调用与OA系统数据对接(多线程版)
  12. 搭建直播平台过程中的全能“辅助”——流媒体服务器
  13. 霍夫曼树之切割木板最小总代价问题
  14. 某些软件中,输入法无法输入中文
  15. 基于C++的UKF代码示例,跟踪三次多项式曲线
  16. 专业方向系列-01-大数据与故障诊断概述
  17. Iconfont 图标大全 样式和代码对齐
  18. 暑期python学习感悟
  19. 程序员年底跳槽必备!自动生成10+种简历模板,总有一个适合你
  20. 多少 程序员珍藏 的 东东...

热门文章

  1. 数组对象去重的四种方式(强推最后一种!!!)
  2. Vue教程-day03-2018年12月21日笔记
  3. 刷机时不显示与电脑连接服务器,刷机工具,连接不上服务器,有人遇到过吗
  4. 微信公众号HTML,H5页面莫名其妙,无故多出广告来,解决办法
  5. 2013渣打科营编程马拉松赛 初始题目
  6. GRE,MGRE技术
  7. Linux上最受欢迎的浏览器大全
  8. html 重定向实现
  9. 私域流量:服装实体店的私域运营实操
  10. 查询出每门课都大于85 分的学生姓名