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

    浏览量

    5593
  • volatile
    +关注

    关注

    0

    文章

    46

    浏览量

    13625
收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    Temu跨境电商按关键字搜索Temu商品API的应用及接口请求示例

    Temu跨境电商按关键字搜索Temu商品API的应用及接口请求示例 Temu跨境电商按关键字搜索Temu商品API的应用场景 Temu跨境电商平台按关键字搜索Temu商品API的主要应用场景包括但不
    的头像 发表于 11-29 15:08 96次阅读

    哪些场合会用到volatile关键字?

    当你理解 volatile关键字的含义之后,你就能明白,其实很多场合都能用到 volatile关键字。 1.全局变量单片机开发,难免会用到全局变量。
    发表于 11-25 08:19

    什么是‍‍volatile

    volatile个类型修饰符(type specifier)。 volatile的作用是作为指令关键字,确保本条指令不会因编译器的优化而省略,且要求每次直接读值。
    发表于 11-25 06:36

    天眼查平台关键字搜索企业数据API接口技术指南

    、接口概述 天眼查提供的企业搜索API接口,支持通过关键字查询企业工商信息、经营状态等核心数据。该接口采用RESTful架构,返回JSON格式数据。 二、接口认证 调用需使用API密钥认证
    的头像 发表于 11-21 11:48 387次阅读
    天眼查平台<b class='flag-5'>关键字</b>搜索企业数据API接口技术指南

    1688平台关键字搜索商品API接口技术实践指南

    /com.alibaba.product/alibaba.product.search/ 必备参数: { "keyword": "手机", // 搜索关键字 "pageNo": 1, // 页码 "pageSize": 20, // 每页数量 "access_token": "xxx" // 认证令牌 } 二、响应
    的头像 发表于 11-11 14:22 256次阅读
    1688平台<b class='flag-5'>关键字</b>搜索商品API接口技术实践指南

    亚马逊平台根据关键字搜索商品API接口

    ​  在电商开发中,集成亚马逊平台的商品搜索功能是常见需求。通过亚马逊的Product Advertising API(PAAPI),开发者可以根据关键字高效检索商品信息。本技术帖将逐步介绍如何调用
    的头像 发表于 11-05 15:00 119次阅读
    亚马逊平台根据<b class='flag-5'>关键字</b>搜索商品API接口

    简单的内联汇编介绍

    // 非必需 : 可能影响的寄存器或存储器 // 非必需 ); “关键字 asm”为GCC 的关键字,表示进行内联汇编操作。 “关键字 volatile”或“ __
    发表于 10-30 08:04

    亚马逊 SP-API 深度开发:关键字搜索接口的购物意图挖掘与合规竞品分析

    本文深度解析亚马逊SP-API关键字搜索接口的合规调用与商业应用,涵盖意图识别、竞品分析、性能优化全链路。通过COSMO算法解析用户购物意图,结合合规技术方案提升关键词转化率,助力卖家实现数据驱动决策,安全高效优化运营。
    的头像 发表于 10-17 14:59 344次阅读

    阿里巴巴国际站关键字搜索 API 实战:从多条件筛选到商品列表高效获客

    ​​在跨境电商数据采集场景中,通过关键字精准搜索商品列表是基础且核心的需求。本文将聚焦阿里巴巴国际站的关键字搜索接口,详细介绍如何构建多条件搜索请求、处理分页数据、解析商品列表信息,并提供可直接复用的 Python 实现方案,帮助开发者快速搭建稳定高效的商品搜索功能。
    的头像 发表于 08-20 09:22 682次阅读
    阿里巴巴国际站<b class='flag-5'>关键字</b>搜索 API 实战:从多条件筛选到商品列表高效获客

    micro 关键字搜索全覆盖商品,并通过 API 接口提供实时数据

    micro 关键字搜索全覆盖商品”并通过 API 接口提供实时数据
    的头像 发表于 07-13 10:13 683次阅读

    单片机编程关键字volatile

    volatile 修饰的变量是说这变量可能会被意想不到地改变。通常对于程序员而言,单片机 中用的就算常见了volatile 是易变的,不稳定的意思。其实对于很多人来说,根本没见过这个关键字,不 知道
    发表于 04-02 13:47 2次下载

    ADS1204 CLKSEL置1时,如何采集数据?怎么知道什么时候是最高位?什么时候是最低位?

    当CLKSEL置1时,如何采集数据?意思是怎么知道什么时候是最高位?什么时候是最低位?
    发表于 02-06 06:51

    mark点定位的一般原理与步骤

    在印刷电路板(PCB)的制造、组装和检测过程中,Mark 点定位是确保精度的关键环节。以下是 Mark 点定位的一般原则和步骤。 ()设计阶段 位置规划 在 PCB 设计之初,就需要
    的头像 发表于 02-05 17:37 2469次阅读

    光谱传感器的一般原理

    光谱传感器是种能够测量物质光谱特性的仪器,其一般原理主要基于物质对不同波长的光的吸收、发射和散射等特性进行分析,从而获取物质的光谱信息。以下是对光谱传感器一般原理的详细解释:
    的头像 发表于 01-05 14:16 1720次阅读

    ADS1299重新烧录后就是堆杂波,造成这样的原因一般是什么?

    关于ADS1299的疑惑,我的程序烧入到自己做的板卡,有时候就能正常采样,无论是外部信号发生器的波形,还是内部测试方波,但有时候重新烧录后(程序一字未动)就是堆杂波。请问造成这样的
    发表于 12-19 08:48