http://wp1314.ycool.com/post.3004898.html

volatile

  表明某个变量的值可能在外部被改变,优化器在用到这个变量时必须每次都小心地重新读取这个变量的值,而不是使用保存在寄存器里的备份。它可以适用于基础类型如:int,char,long......也适用于C的结构和C++的类。当对结构或者类对象使用volatile修饰的时候,结构或者类的所有成员都会被视为volatile.
  该关键字在多线程环境下经常使用,因为在编写多线程的程序时,同一个变量可能被多个线程修改,而程序通过该变量同步各个线程。
  简单示例:
   DWORD __stdcall threadFunc(LPVOID signal)
   {
     int* intSignal="reinterdivt"_cast(signal);
     *intSignal=2;
     while(*intSignal!=1)
     sleep(1000);
     return 0;
   }
  该线程启动时将intSignal 置为2,然后循环等待直到intSignal 为1 时退出。显然intSignal的值必须在外部被改变,否则该线程不会退出。但是实际运行的时候该线程却不会退出,即使在外部将它的值改为1,看一下对应的伪汇编代码就明白了:
     mov ax,signal
     label:
     if(ax!=1)
     goto label
  对于C编译器来说,它并不知道这个值会被其他线程修改。自然就把它cache在寄存器里面。C 编译器是没有线程概念的,这时候就需要用到volatile。volatile 的本意是指:这个值可能会在当前线程外部被改变。也就是说,我们要在threadFunc中的intSignal前面加上volatile关键字,这时候,编译器知道该变量的值会在外部改变,因此每次访问该变量时会重新读取,所作的循环变为如下面伪码所示:
     label:
     mov ax,signal
     if(ax!=1)
     goto label
  注意:一个参数既可以是const同时是volatile,是volatile因为它可能被意想不到地改变。它是const因为程序不应该试图去修改它。

转载于:https://www.cnblogs.com/bettermanlu/archive/2010/06/20/1761319.html

[zz]volatile相关推荐

  1. C语言volatile关键字详解

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

  2. 详解C中volatile关键字

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

  3. [c++] volatile关键字

    [转]https://www.cnblogs.com/yc_sunniwell/archive/2010/06/24/1764231.html volatile提醒编译器它后面所定义的变量随时都有可能 ...

  4. 【转】 详解C中volatile关键字

    转自: http://www.cnblogs.com/yc_sunniwell/archive/2010/06/24/1764231.html volatile提醒编译器它后面所定义的变量随时都有可能 ...

  5. 桌面计算机器,你的,桌面自平衡 机器人—Zz

    本帖最后由 Mingming.Zhang 于 2018-7-19 10:28 编辑 IMG_1084.jpg (58.05 KB, 下载次数: 25) 2018-6-10 10:51 上传 如 何 拥 ...

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

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

  7. 从底层吃透java内存模型(JMM)、volatile、CAS

    前言 随着计算机的飞速发展,cpu从单核到四核,八核.在2020年中国网民数预计将达到11亿人.这些数据都意味着,作为一名java程序员,必须要掌握多线程开发,谈及多线程,绕不开的是对JMM(Java ...

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

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

  9. 嵌入式系统开发过程中遇到的——volatile

    嵌入式 系统开发过程中遇到的-- volatile 对于不同的计算机体系结构,设备可能是端口映射,也可能是内存映射的 .如果系统结构支持独立的 I/O 地址空间,并且是端口映射,就必须使用汇编语言完成 ...

最新文章

  1. Skype for Business Server 2015-03-后端服务器-0-准备
  2. android 组装xml,Android中组装xml文件内容
  3. SAP科目的行项目显示未勾选补救步骤
  4. php 怎么防止提交空记录,为什么空提交什么都不提示?
  5. 深度残差收缩网络:(三)网络结构
  6. linux-查看用户id-查看文件目录所有者-查看进程操作者
  7. linux scp 使用简单说明
  8. atitit.提升开发效率---MDA 软件开发方式的革命(5)----列表查询建模
  9. 社会工程学实践前言和开篇
  10. 下载pdf分页和不分页代码
  11. HTML制作简单课程表
  12. 计算机bios无法进入安全模式,电脑的BIOS设置能进入安全模式吗
  13. 计算机未响应怎样解决方案,电脑提示Internet Explorer未响应怎么办?解决IE浏览器未响应的解决方法...
  14. 嵌入式Linux开发板_WIFI无线网卡驱动移植
  15. SunlightCoin简介——SunlightCoin 人人都是矿工
  16. Verilog中task使用
  17. 【WebGIS面试经验】(一)本以为没戏却成功了的面试
  18. 1349. 最大公约数
  19. 运维日常之机房浪潮服务器硬盘红灯亮起,服务器一直响,raid磁盘红色。。。故障解决方法
  20. CSSHTMLREM制作手机端网页(小练习)

热门文章

  1. 使命召唤手游迎来欧阳娜娜,这阵容够豪华,玩家期待吗?
  2. mysql事务操作——transaction
  3. Mysql 数据类型(整数、浮点数、定点数、字符串)【类型取值范围】
  4. Linux Shell编程第四篇case语句
  5. 写存储过程与调用存储过程
  6. python相关工具
  7. 关于 Python generator(生成器)的类比
  8. 类库dll引用不成功问题
  9. 菜单工具栏wxPython菜单与工具栏基础示例
  10. [leetcode]Edit Distance