原文地址:

http://www.cnblogs.com/yc_sunniwell/archive/2010/06/24/1764231.html

volatile提醒编译器它后面所定义的变量随时都有可能改变,因此编译后的程序每次需要存储或读取这个变量的时候,都会直接从变量地址中读取数据。如果没有volatile关键字,则编译器可能优化读取和存储,可能暂时使用寄存器中的值,如果这个变量由别的程序更新了的话,将出现不一致的现象。下面举例说明。在DSP开发中,经常需要等待某个事件的触发,所以经常会写出这样的程序:
short flag;
void test()
{
do1();
while(flag==0);
do2();
}

这段程序等待内存变量flag的值变为1(怀疑此处是0,有点疑问,)之后才运行do2()。变量flag的值由别的程序更改,这个程序可能是某个硬件中断服务程序。例如:如果某个按钮按下的话,就会对DSP产生中断,在按键中断程序中修改flag为1,这样上面的程序就能够得以继续运行。但是,编译器并不知道flag的值会被别的程序修改,因此在它进行优化的时候,可能会把flag的值先读入某个寄存器,然后等待那个寄存器变为1。如果不幸进行了这样的优化,那么while循环就变成了死循环,因为寄存器的内容不可能被中断服务程序修改。为了让程序每次都读取真正flag变量的值,就需要定义为如下形式:
volatile short flag;
    需要注意的是,没有volatile也可能能正常运行,但是可能修改了编译器的优化级别之后就又不能正常运行了。因此经常会出现debug版本正常,但是release版本却不能正常的问题。所以为了安全起见,只要是等待别的程序修改某个变量的话,就加上volatile关键字。

最新文章

  1. Nginx二级域名及多Server反向代理配置
  2. 【转载】 Android PullToRefresh (ListView GridView 下拉刷新) 使用详解
  3. 数论+spfa算法 bzoj 2118 墨墨的等式
  4. opencv 手势识别
  5. mysql--help不可用
  6. EnyimMemcached扩展 遍历功能
  7. FIFO算法
  8. ASP.NET 5应用是如何运行的(3)
  9. A. Launch of Collider Codeforces Round #363 (Div2)
  10. javascript 如何正确使用getElementById,getElementsByName(), and getElementsByTagName()
  11. input选择框样式修改与自定义
  12. oracle11g 数据库修改 UTF8字符集
  13. 【转】python两个 list 获取交集,并集,差集的方法
  14. vue.js中内联样式style三元表达式
  15. tensorflow学习笔记
  16. WPF 定义Lookless控件的默认样式、 OnApplyTemplate 如何使用(实现方式、如何工作的)!
  17. oracle常见受权与回收权限 grant和revoke
  18. mybatis源码-解析配置文件(二)之解析的流程
  19. sql server 2005 怎么看是不是企业版
  20. 修改nose_html_reporting,解决输出带中文时,不能生成html文件

热门文章

  1. 自动化kolla-ansible部署ubuntu20.04+openstack-victoria之实例类型-10
  2. React/Vue里的key到底有什么用?看完这篇你就知道了!(附demo代码)
  3. 内网渗透-windows认证
  4. linux下export命令添加删除环境变量
  5. Web漏洞小结
  6. 简化mapstruct代码: mapstruct-spring-plus
  7. 【vue-05】vue-cli
  8. 老师不讲的C语言知识
  9. cetnos中nmap端口扫描工具的使用
  10. SpringBoot系列——Activiti7工作流引擎