0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

一般什么时候需要使用volatile关键字

电子设计 来源:电子设计 作者:电子设计 2020-12-24 17:29 次阅读

想必大家平时都见过volatile关键字,可是大家知道什么时候需要使用volatile关键字吗?

直接看下面代码:

int a = 100;

while (a == 100) { // code}

这段程序编译时,如果编译器发现程序始终没有企图改变a的值,那它可能就会优化这段代码,变成while(true)的死循环使得程序执行的更快,然而这种优化有时候会变成过度优化,编译器有时候可能没有意识到程序会改变a的值,却做了这种优化导致程序没有产生预期的行为。

这里为了产生预期的行为,需要阻止编译器做这种优化,可以使用volatile关键字修饰。

volatile int a = 100;

volatile关键字和const关键字相对应,const关键字告诉编译器其修饰的变量是只读的,编译器根据只读属性做一些操作,而volatile关键字告诉编译器其修饰的变量是易变的,同理编译器根据易变属性也会做一些操作。它会确保修饰的变量每次都读操作都从内存里读取,每次写操作都将值写到内存里。volatile关键字就是给编译器做个提示,告诉编译器不要对修饰的变量做过度的优化,提示编译器该变量的值可能会以其它形式被改变。

volatile修饰结构体时,结构体的成员也是volatile的吗

struct A { int data;};volatile A a;const A b;

答案是结构体内所有的都是volatile,引用c++标准里的一句话:

[Note: volatile is a hint to the implementation to avoid aggressive optimization involving the object because the value of the object might be changed by means undetectable by an implementation. See 1.9 for detailed semantics. In general, the semantics of volatile are intended to be the same in C + + as they are in C. ]

这里大体可以理解为一个对象是volatile,那对象里所有的成员也都是volatile。其实const和volatile可以理解为是硬币的两面,我们经常听到看到传说中的CV修饰词就是const和volatile关键字。

volatile可以保证原子性吗?

想必大家都知道答案,volatile只保证内存可见性,不能保证操作是原子的,拿i++举例:

volatile int i = 0;i++; // i = i + 1

i++ 相当于i=i+1,而i=i+1其实可以分解为好几步:

先读取i的值到tmp

增加tmp的值

把tmp的值写回到i的地址里

而volatile只能保证内存可见,可以理解为上述三步中的每一步都是原子的,但是三步合起来却不一定是原子的,因为在多线程中三步中间可能插入一些其它操作改变了预期的行为,所以volatile不能用在多线程中,多线程中的原子操作还是需要使用atomic。单例模式的double check方法中instance变量为什么需要使用volatile修饰也是这个原理。

小总结

tips:volatile不能解决多线程安全问题,针对特种内存才需要使用volatile,它和atomic的特点如下:std::atomic用于多线程访问的数据,且不用互斥量,用于并发编程中。

volatile用于读写操作不可以被优化掉的内存,用于特种内存中。

审核编辑:符乾江
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 程序编译
    +关注

    关注

    0

    文章

    9

    浏览量

    5456
  • volatile
    +关注

    关注

    0

    文章

    45

    浏览量

    13009
收藏 人收藏

    评论

    相关推荐

    C语言关键字分别发生在哪个阶段

    在编译的第个阶段:预处理,对些宏定义做替换。 第二个,const。 C语言中的 const 用于修饰只读变量,表示变量本身不能修改。 这个关键字会在编译的第二步起作用,也就是编译。强行修改
    的头像 发表于 11-24 10:31 68次阅读

    C语言关键字--typedef

    C语言关键字使用方法学习指南!
    的头像 发表于 10-07 12:44 174次阅读

    一般运算放大器什么时候是数字电压供电什么时候是模拟电压供电?

    您好,我发现在有的电路中,运算放大器是数字电源,有时候又是模拟电源供电,请问一般运算放大器什么时候是数字电压供电什么时候是模拟电压供电?
    发表于 09-11 06:03

    一般继电器需要多少电流才能驱动

    一般继电器所需的驱动电流会根据其型号、规格和额定工作电压等因素有所不同。通常,继电器需要定的电流来驱动其线圈产生磁场,从而使触点闭合或断开。以下是对继电器驱动电流的一般性说明:
    的头像 发表于 09-05 15:18 2191次阅读

    使用边缘AI和Sitara处理器进行关键字检测

    电子发烧友网站提供《使用边缘AI和Sitara处理器进行关键字检测.pdf》资料免费下载
    发表于 09-02 11:30 0次下载
    使用边缘AI和Sitara处理器进行<b class='flag-5'>关键字</b>检测

    快速掌握C语言关键字

    C语言中的32个关键字你知道多少个呢?根据关键字的作用分为四类:数据类型关键字、控制语句关键字、存储类型关键字和其它
    的头像 发表于 07-06 08:04 304次阅读
    快速掌握C语言<b class='flag-5'>关键字</b>

    关键字搜索文件夹中某个TXT文件

    文件夹中随时创造TXT文件,如何及时选出刚创造的文件?或关键字搜索出需要的TXT文件?
    发表于 02-06 15:22

    在NVM和本地\"内存中定义数组(静态 /global /local)的\"关键字是什么?

    在 NVM 和本地\"内存中定义数组(静态 /global /local)的\"关键字是什么? 还有与 32 位对齐的关键字怎么样。
    发表于 01-25 07:52

    请问电机绕组保护编号一般怎么选?

    什么时候选择PTC,什么时候选择PT100,加6个PT100主要是考虑什么呢? 有什么原则,大家一般怎么选择?
    发表于 01-10 06:11

    探讨多线程编程中的volatile关键字应用

    时候,我们可能需要在指针类型之间进行转换,而编译器会认为这是不安全的操作,从而导致编译错误。使用volatile关键字可以告知编译器,这个类型转换是有意义的,不应该引发错误。
    发表于 12-27 13:53 420次阅读

    你还记得这个C语言关键字吗?

    当你使用volatile关键字时,你告诉编译器该变量的值可能会在程序的执行过程中被外部因素更改,因此编译器不应该对该变量的读写进行优化。下面是些使用volatile的例子,以及对它们
    的头像 发表于 12-17 08:00 332次阅读
    你还记得这个C语言<b class='flag-5'>关键字</b>吗?

    pcb设计一般流程步骤

    pcb设计一般流程步骤
    的头像 发表于 12-13 17:30 3867次阅读

    嵌入式软件开发常用的关键字和运算符

    volatile个特征修饰符,提醒编译器它后面所定义的变量随时都有可能改变,因此编译后的程序每次需要存储或读取这个变量的时候,告诉编译器对该变量不做优化,都会直接从变量内存地址中读
    的头像 发表于 12-04 12:22 563次阅读

    vlookup提取关键字匹配多个结果

    是它能够基于关键字匹配提取多个结果。 当使用VLOOKUP提取多个结果时,需要遵循以下几个重要步骤。首先,您需要确保数据的组织和结构正确。数据应以表格格式排列,左侧为关键字列,右侧为相
    的头像 发表于 12-01 10:40 2343次阅读

    开发java程序的一般步骤是

    开发Java程序的一般步骤通常包括需求分析、设计、编码、测试和部署等阶段。下面将详细介绍Java程序开发的一般步骤。 需求分析阶段: 在开始开发Java程序之前,首先需要进行需求分析。需求分析是确定
    的头像 发表于 11-28 16:43 1570次阅读