内容摘抄自https://www.jb51.net/article/85852.htm,感谢原作者分享

volatile原意是“易变的”,但这种解释简直有点误导人,应该解释为“直接存取原始内存地址”比较合适。

“易变”是相对与普通变量而言其值存在编译器(优化功能)未知的改变情况(即不是通过执行代码赋值改变其值的情况),而是因外在因素引起的,如多线程,中断等。编译器进行优化时,它有时会取一些值的时候,直接从寄存器里进行存取,而不是从内存中获取, 这种优化在单线程的程序中没有问题,但到了多线程程序中,由于多个线程是并发运行的,就有可能一个线程把某个公共的变量已经改变了,这时其余线程中寄存器的值已经过时,但这个线程本身还不知道,以为没有改变,仍从寄存器里获取,就导致程序运行会出现未定义的行为。并不是因为用volatile修饰了的变量就是“易变”了,假如没有外因,即使用volatile定义,它也不会变化。而加了volatile修饰的变量,编译器将不对其相关代码执行优化,而是生成对应代码直接存取原始内存地址。

一般说来,volatile用在如下的几个地方:

1. 中断服务程序中修改的供其它程序检测的变量需要加volatile;
2. 多任务环境下各任务间共享的标志应该加volatile;
3. 存储器映射的硬件寄存器通常也要加volatile说明,因为每次对它的读写都可能有不同意义;

后续计划写一个C++例程,分析在优化后编译成的汇编指令(第二步用gdb调试探微…),本文待更新…

C++ volatile关键字说明相关推荐

  1. java中实现具有传递性吗_Java中volatile关键字详解,jvm内存模型,原子性、可见性、有序性...

    一.Java内存模型 想要理解volatile为什么能确保可见性,就要先理解Java中的内存模型是什么样的. Java内存模型规定了所有的变量都存储在主内存中.每条线程中还有自己的工作内存,线程的工作 ...

  2. volatile关键字之全面深度剖析

    引言 volatile这个关键字可能很多朋友都听说过,或许也都用过.在Java 5之前,它是一个备受争议的关键字,因为在程序中使用它往往会导致出人意料的结果.在Java 5之后,volatile关键字 ...

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

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

  4. C语言volatile关键字详解

    volatile提醒编译器它后面所定义的变量随时都有可能改变,因此编译后的程序每次需要存储或读取这个变量的时候,都会直接从变量地址中读取数据.如果没有volatile关键字,则编译器可能优化读取和存储 ...

  5. 爆赞,对 volatile 关键字讲解最好的一篇文章!

    欢迎关注方志朋的博客,回复"666"获面试宝典 最近,在一篇文章中了解到了 volatile 关键字,在强烈的求知欲趋使下,我查阅了一些相关资料进行了学习,并将学习笔记记录如下,希 ...

  6. Java并发编程:JMM和volatile关键字

    Java内存模型 随着计算机的CPU的飞速发展,CPU的运算能力已经远远超出了从主内存(运行内存)中读取的数据的能力,为了解决这个问题,CPU厂商设计出了CPU内置高速缓存区.高速缓存区的加入使得CP ...

  7. c#中volatile关键字的作用

    恐怕比较一下volatile和synchronized的不同是最容易解释清楚的.volatile是变量修饰符,而synchronized则作用于一段代码或方法:看如下三句get代码: int i1;  ...

  8. 26张图带你彻底搞懂volatile关键字

    引子 小艾吃饭路上碰上小牛,忙问:你昨天面大厂面的咋样了?听说他们最喜欢问多线程相关知识. 小牛说:对啊,第一个问题我就讲了20分钟,直接把面试官讲服了. 小艾忙问:什么问题能讲这么久?是不是问你情感 ...

  9. C++中的volatile关键字

    1.使用 volatile int i = 10; 2.使用volatile时要几个注意的点: volatile 关键字是一种类型修饰符,用它声明的类型变量表示可以被某些编译器未知的因素(操作系统.硬 ...

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

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

最新文章

  1. mysql 的not null 与 null的区别(转,恍然大悟)
  2. 【android4.3】记一次完整的android源码截屏事件的捕获(不同于网上的老版本)
  3. python使用ddt_python使用ddt模块对用例执行操作
  4. Java ObjectStreamField getName()方法与示例
  5. linux查看命令的帮助文档,Linux查看命令和帮助文件位置
  6. 武汉月薪1万5,感到焦虑怎么办?
  7. Mediator(中介者)
  8. webserver接口调用(一)
  9. linux图形显卡驱动r600,R600/R700八款显卡Mesa开源驱动性能简测
  10. Kattis - bumped B - Bumped! (最短路)
  11. 一小时建立终生受用的阅读操作系统-笔记
  12. 华硕部分飞行堡垒系列安装ubuntu16.04(uefi+gpt+win10环境)
  13. OpenCV中使用Eigenfaces人脸识别器识别人脸实战(附Python源码)
  14. 利用VBA将excel中链接转换为图片形式存放在指定的单元格中
  15. 收集到一些关于python的文章,存起来慢慢看。。。
  16. [NLP] 实例讲解 N-gram语言模型 中 Good-Turning 平滑技术
  17. 本周白银价格走势仍关注美经济数据
  18. 阿里云OSS 分块上传的代码整理
  19. 数据选择器的级联扩展
  20. pyhanlp 繁简转换之拼音转换与字符正则化

热门文章

  1. Object-C 入门
  2. Google 发布网页统计报告
  3. 操作系统实验报告16:CPU 调度
  4. 【数据结构与算法】之深入解析“路径总和III”的求解思路与算法示例
  5. 96. Unique Binary Search Trees 不同的二叉搜索树
  6. python人工智能——机器学习——分类算法-k近邻算法
  7. CCS5.5环境下使用clock()函数测试程序段运行时间
  8. 【Qt】New Features in Qt 5.15
  9. 【STM32】FreeRTOS列表和列表项详解
  10. 【Tools】TeamViewer安装教程