栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

C语言——volatile

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

C语言——volatile

  变量和它的名字一样很善变,有时候它的善变是“发自内心”的,有时是由外部因素决定的,只有volatile变量才是表里如一。
  Volatile的字面意思是易挥发、易变化的意思,它修饰的变量表示该变量的值很容易由于外部因素而发生改变,强烈请求编译器在每次对变量进行访问时要老老实实地去内存里读取。可能上面说得还不是很清楚,我们换个例子来说明,假设明天一个朋友过生日,今天你就把要送的礼物打包好了,在一般情况下,我们明天起来不需要再打开验证一下礼物是否存在,因为我们知道,只要礼物的外包装没有动过,里面的东西应该不会被动过,其实编译器和人一样聪明,为了提高效率也会玩“省事”,例如下面的代码:

int a = 10;
int b = a;
int c = a;

  编译器扫描了代码后容易发现,第一行代码在将10赋给了整型变量a,之后变量a的值没有再发生改变。在第二行中,将变量a里的值取出来赋给变量b。在三行代码里将变量a的值赋给变量c的时候,因为CPU访问内存速度较慢,编译为了提高效率,玩“省事”,直接将10赋给了变量c。
  单从上述代码来看没有问题的,就如同从外包装看生日礼物完好一样。但是,上述代码如果运行在多线程中,在一个线程的上下文中没有改变它的值,但是我们不能保证变量的值没有被其他线程改变。就好比是,生日礼物放到其他人那里保存,我们不敢100%保证它里面的东西还完好。
  当然,这种数据不一致的机制不仅仅出现在多线程中,同样在设备的状态寄存器里也会存在。例如,网卡里的某状态寄存器里的值是否为1表示是否有网络数据到达,在当前时刻其值未1,不能代表着下一时刻其值还为1,它的值是由外界条件决定的,编译器肯定不能在这种情况下玩“省事”,为了防止在类似的情况下编译器玩“省事”,可以将这些变量声明为volatile变量,这样,不管它的值有没有变化,在每次对其值进行访问时,都会从内存里、寄存器里读取,从而保证数据的一致性,做到表里如一。

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/512997.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号