volatile关键字的使用

volatile变量直接在CPU和内存之间交换,不通过一级、二级缓存。
考虑下面的代码:
代码:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
class Gadget
{
public:
    void Wait()
    {
        while (!flag_)
        {
            Sleep(1000); // sleeps for 1000 milliseconds
        }
    }
void Wakeup()
{
    flag_ = true;
}
//...
private:
    bool flag_;
};
上面代码中Gadget::Wait的目的是每过一秒钟去检查一下flag_成员变量,当flag_被另一个线程设为true时,该函数才会返回。至少这是程序作者的意图,然而,这个Wait函数是错误的。
      假设编译器发现Sleep(1000)是调用一个外部的库函数,它不会改变成员变量flag_,那么编译器就可以断定它可以把flag_缓存在寄存器中,以后可以访问该寄存器来代替访问较慢的主板上的内存。这对于单线程代码来说是一个很好的优化,但是在现在这种情况下,它破坏了程序的正确性:当你调用了某个Gadget的Wait函数后,即使另一个线程调用了Wakeup,Wait还是会一直循环下去。这是因为flag_的改变没有反映到缓存它的寄存器中去。编译器的优化未免有点太……乐观了。
      在大多数情况下,把变量缓存在寄存器中是一个非常有价值的优化方法,如果不用的话很可惜。C和C++给你提供了显式禁用这种缓存优化的机会。如果你声明变量是使用了volatile修饰符编译器就不会把这个变量缓存在寄存器里——每次访问都将去存取变量在内存中的实际位置。这样你要对Gadget的Wait/Wakeup做的修改就是给flag_加上正确的修饰:
1
2
3
4
5
6
7
class Gadget
{
public:
    //... as above ...
private:
    volatile bool flag_;
};

转载于:https://www.cnblogs.com/duyy/p/3666442.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/432691.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

微信小程序页面栈_微信小程序使用页面栈改变上一页面的数据

微信小程序中如果从一个页面中进入下一个页面,如果下个页面的数据有删除或者增加再返回上一个页面的时候,就会导致页面不刷新(数据加载函数在onload中),从而造成数据不一致的情况。其实在微信小程序中是可以实现改变上一个页面中的数据似的前…

华中师范大学计算机考研论坛,2020年华中师范大学计算机考研经验分享

本人是2020年考入华中师范大学计算机专业硕士的学生,已成功上岸,下面给大家分享一下我的个人考研经验。我为什么考研我从大一就已经确定要考研,毕竟自己错过了高考这样的机会,希望自己的人生能再一次重新洗牌,不受人冷…

OSD锁定怎么解锁?

方法是这样的: 先按中间的建关掉显示器电源,关了显示器后按住左键,在按中间的建开机,这时屏幕闪一下就解锁了。在按中间的建打开显示器就行了。 加锁的方法和解锁一样转载于:https://www.cnblogs.com/code4app/p/3667351.ht…

can帧格式 dlc_深度解析CAN

随着当今工业的发展,尤其是在CAN根据CAN规范ISO11898-2所定义的标准帧结构,一帧报文最大只能传输64位(8个字节)的数据,在最好的情况下总线负载达到70%左右,不过如果报文数据少于8个字节的情况下总线负载可能会更小。我们或者会提出…

离散数学图论旅行规划问题_《图论及其应用》(一)

点击返回目录 一. 定义1.1 图的基本概念图或有序对或序偶(P1)、有限图/平凡图/非平凡图/空图(P1)、顶点数或阶数/边数/重数/重边/环(P1)、简单图/复合图(P1)、相邻(P2&am…

ELF文件和BIN文件

文件的内容:1. BIN文件是 raw binary 文件,这种文件只包含机器码。2. ELF文件除了机器码外,还包含其它额外的信息,如段的加载地址,运行地址,重定位表,符号表等。所以ELF文件的体积比对应的BIN文…

计算机辅助项目管理课程方案,天津大学计算机辅助管理研究生课程简介

8 / 14【育明教育】中国考研考博专业课辅导第一品牌 官方网站:http://www.doczj.com/doc/e25fb4dad4d8d15abe234eb2.html8《翻译硕士英语》重点考察考生的英语水平,内容包括:词汇语法、阅读理解、英语写作等, 总分 100 分。 二、考…

android list 替换元素_Python数据结构(一)List使用(大厂面试解答)

List是什么?List顾名思义就是列表,那么它具体描述是什么呢?列表是一个线性的集合,它允许用户在任何位置插入、删除、访问和替换元素。在Python中list是保留字,List中的每个元素都有自己的编号,很像C、C、ja…

河北2018年职称计算机开始,2018河北职称计算机考试操作题答案(8页)-原创力文档...

PAGEPAGE 131、说明:以下文件名及文件夹名均不区分大小写,而且所有字母和数字都是英文半角字符1、?在ComputerA文件夹下建立如下的文件夹结构:(4分)????ComputerA?———北京——海淀区??????????????|?????????…

mkenvimage

mkenvimage -s bin文件size -o uboot-env.bin uboot-env.txt

关于php的字符串编码

PHP中的字符串可以用四中方式来定义: 单引号,双引号,Nowdoc结构 , heredoc 结构 也就说用这四中方式命名的字符串不管有没有值,都是字符串类型的变量。 但是,字符串遍历是已经定义好了怎么操作这些字符串&a…

java 获取打印机缺纸_JAVASE 语言概述和JAVA

第一章:开发前言计算机分为硬件和软件,一般来说。硬件就是组成计算机的可见的物理组件。我们的电脑、手机、电子设备都算一个小的计算机。而软件提供看不见的指令,这些指令控制硬件并且通过硬件完成特定任务。常见硬件:CPU、内存、…

计算机图形处理与应用程序,计算机图形处理与应用

本文主要介绍了计算机图形图像处理的基本概念;导出三维图形几何变换矩阵的一般形式;简要介绍了消隐技术;介绍了AutoLISP语言的功能、特点及绘图程序,并结合简单实例,展示了开发的实际效果。计算机图形处理及其应用摘要计算机图像处理技术产生于上个世纪80年代末,经历…

ARM Linux 3.x的设备树(Device Tree)

宋宝华 Barry Song <21cnbaogmail.com>1. ARM Device Tree起源 Linus Torvalds在2011年3月17日的ARM Linux邮件列表宣称“this whole ARM thing is a f*cking pain in the ass”&#xff0c;引发ARM Linux社区的地震&#xff0c;随后ARM社区进行了一系列的重大修正。在…

冯诺依曼原理中计算机包括功能部件,水泥越细,强度发展越快,对混凝土性能也越好...

现象其结定相同的不一果却&#xff0c;水泥现象现象现象确定模糊机现非随随机&#xff0c;下同的条件在相&#xff0c;称为。、越细越快也效期望强度联性某价C激励激励、关值B水平&#xff0c;需要学习得到的机脱产会”“我非常是否属于。下面不是哪个功能够完成的操作页能开始…

win7连接sftp_SFTP远程连接服务器上传下载文件-vs2013项目实例

本项目仅测试远程连接服务器&#xff0c;支持上传&#xff0c;下载文件&#xff0c;更多功能开发请看API自行开发。环境&#xff1a;win7系统&#xff0c;vs2013vs2013项目实例下载地址&#xff1a;CSDN下载如果没有CSDN积分&#xff0c;百度网盘下载(密码&#xff1a;uqob)文件…

累觉不爱

不知不觉已经九年了&#xff0c;再过一个年头就满十了。 记得刚入职AI的时候&#xff0c;看着有人捧着个十年奉献奖的时候&#xff0c;心里还是有些小小的鄙夷的。那时候朝气蓬勃&#xff0c;充满自信&#xff0c;什么都是不放在眼里的。 在AI的前五年&#xff0c;即是成长最快…

南科大计算机系实力a,五大竞赛学科A+高校排行榜发布!北大实力碾压,科大赶超清华...

什么是学科评估&#xff1f;学科评估是教育部官方针对全国大学的专业实力进行分档而得到的&#xff0c;在评价高校的单一专业实力方面非常权威。学科评估分为A、A、A-、B等共9个等级&#xff0c;每个等级内的高校不再另做排名&#xff0c;只为等级不排名次。其中学科评估为A的要…

设置最大值_变频器用远传压力表控制恒压供水参数设置

变频器控制恒压供水的应用介绍在这里以台达变频器为例&#xff0c;利用远传压力表作为反馈信号。控制要求&#xff1a;① 恒压供水变频器的启动和停止&#xff0c;要求用数字面板操作器来控制启停&#xff1b;② 设定压力值要求用数字面板上下键来设定压力(数字0-50对应0-压力表…