这个变量要不要用volatile修饰呢?

news2024/9/21 20:41:51

2d14f5477ec1723dcf94e0ce543a609b.jpeg

正文


大家好,又见面了,我是bug菌~

在嵌入式软件开发过程中,如果对volatile不熟,那可以你应该是个"假嵌入式程序员",因为一个变量需不需要使用volatile考虑的场景挺多的,如果在某些场景下乱用,会影响程序运行效率,有时候忘记加甚至会使得程序发生异常,那么bug菌今天就大家好好聊聊这个C语言关键字:

1

传统定义

volatile直译为“易变的”,也就是告诉编译器这个变量随时都可能发生变化,编译器你跟我“特殊照顾一下“。

那么编译器通常会怎么去处理使用volatile修饰的变量呢?

对于C变量都是代表着对应的内存,读取使用volatile修饰的变量,会直接从其所对应的内存地址中获取最新的数据,否则,编译器会对其访问进行优化,比如直接从缓存中读取副本、或者是从寄存器中读取副本。

这样就可能会导致数据更新不一致的问题。

2

最常用的地方

从前面对volatile的功能描述,我们可以知道volatile最常用于那些与硬件外设寄存器打交道的地址,这样确保每次对寄存器的读取都是从内存中获取的最新值,比如:

4e9ea24c36131276587dc0386f2d82f0.jpeg

再比如下图所示,如果我们向地址0x812100地址连续改变其值:

12a728ec2487a3f3f32cb1d25f27a626.jpeg

那么编译器通常会将其直接优化为第三条操作,并不会去执行前两条操作,这样会造成写寄存器时序上的问题。

如果采用volatile去修饰,则三条命令便会依次执行,达到我们代码所示三次操作的目的。

e539084ecee4a8486bb2dfcc1ffd572c.jpeg

3

更复杂一点的,也是最重要的 

其实对于volatile所解决的问题用更加专业的说法可以分为:可见性和有序性。

1、可见性

所谓可见性,通常是在多线程访问共享数据的情况,当一个线程对共享变量进行修改,而其他线程能否立即观察到这个修改的性质。

在我们目前大部分单核一级缓存的CPU无需考虑这个问题,而对于现场多核多级缓存处理器,各个现场都会维护着自己的缓存,如果仅仅只是更新到了自己的缓存中那么其他线程是无法立马感受到这个修改的,最终导致结果不一致。

2、有序性

很多时候也叫作重排序,说白了就是对执行指令进行了执行顺序上的优化,以不改变指令运行的最终结果,而改变指令的执行顺序。

编译器可以调整指令,同样处理器的多级流水线和乱序执行也同样可以改变指令执行顺序;甚至为了多级缓存的高效执行,也同样会对内存读写操作进行重排序。

然而这样的重排序,却会对多线程并发访问共享数据的过程中产生问题,从而不符合我们编程源码的预期执行顺序。

但对于volatile只能在一定程度上防止指令重排序,其只能保证单个变量访问的有序性,而不能保证整个程序的有序性,所以这一点是大家尤为要注意的。

所以讲了这么多,相信以后大家再开发中也都会遇到。

最后

      好了,今天就跟大家分享这么多了,如果你觉得有所收获,一定记得点个~

bug菌唯一、永久、免费分享嵌入式技术知识平台~

876030fb4a2ee27e40abc29af9f0969d.jpeg

推荐专辑  点击蓝色字体即可跳转

☞  MCU进阶专辑 9dabfd9b6c2e30e9a4ba6944d4c28717.jpeg

☞  嵌入式C语言进阶专辑 30425c91c53b8e40c928281d7e85b10f.jpeg

☞  “bug说”专辑 a31d7ccd9516af5a4a77084a4f6fd9b4.jpeg

☞ 专辑|Linux应用程序编程大全

☞ 专辑|学点网络知识

☞ 专辑|手撕C语言

☞ 专辑|手撕C++语言

☞ 专辑|经验分享

☞ 专辑|电能控制技术

☞ 专辑 | 从单片机到Linux

309850b60fcd0c4e2e53f6cef79391b1.jpeg

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

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

相关文章

OpenGL笔记:纹理的初次使用

说明 纹理的代码写完后,一直出不来结果,原因是没有设置GL_TEXTURE_MIN_FILTER, 它的默认值为GL_NEAREST_MIPMAP_LINEAR, 因为这里我还没用到Mipmap,所以使用这个默认值,结果是错误的,关于mipma…

pycharm全网最新安装教程(附加activation code),支持2018-2023版本

官网地址Download PyCharm: Python IDE for Professional Developers by JetBrains 下载的话无脑下载安装即可! 2018.2~2023版本用这个,最新的activation code码 2018.1以下版本用这个 老是审核不通过只能贴图片了(T-T)

pycharm右键执行,出现Run ‘Python tests in xxx‘的问题

1.问题描述 用pytest框架写了一个python的模块,右键执行时发现,执行的模块显示有问题,如下图所示 2.解决问题 Python tests这表示,当前运行的代码文件进入了pytest模式,pytest模式不同于run模式,因为运行…

基于SSM的论文管理系统的设计与实现

末尾获取源码 开发语言:Java Java开发工具:JDK1.8 后端框架:SSM 前端:Vue 数据库:MySQL5.7和Navicat管理工具结合 服务器:Tomcat8.5 开发软件:IDEA / Eclipse 是否Maven项目:是 目录…

Leetcode(面试题 08.01.)三步问题

文章目录 前言一、题目分析二、算法原理1.状态表示2.状态转移方程3.初始化4.填表顺序5.返回值是什么 三、代码实现总结 前言 在本文章中,我们将要详细介绍一下Leetcode(面试题 08.01.)三步问题相关的内容 一、题目分析 1.小孩可以上一阶,两阶&#xff…

Redis深入理解-主从架构下内核数据结构、主从同步以及主节点选举

Redis 主从挂载后的内核数据结构分析 主节点中,会通过 clusteNode 中的 slaves 来记录该主节点包含了哪些从节点,这个 slaves 是一个指向 *clusterNode[] 数组的数据结构从节点中,会通过 clusterNode 中的 slaveof 来记录该从节点属于哪个主…

鸿蒙应用开发-初见:入门知识、应用模型

基础知识 Stage模型应用程序包结构 开发并打包完成后的App的程序包结构如图 开发者通过DevEco Studio把应用程序编译为一个或者多个.hap后缀的文件,即HAP一个应用中的.hap文件合在一起称为一个Bundle,bundleName是应用的唯一标识 需要特别说明的是&…

Unity针对XBOX,SWITCH,PS5手柄的适配踩坑

前言: 记录一点最近在做手柄适配问题的踩坑。 这里推荐一款Unity做手柄适配的插件->Rewired Rewired官方文档链接Rewired Documentation | Supported Controllers Rewired插件里面有个是Player类,这个类获取到当前玩家的输入设备,输入…

ruby3.2.2 报错 undefined symbol: EC_GROUP_new_curve_GF2m

一、执行ruby -ropenssl -e puts OpenSSL::OPENSSL_VERSION 查看openssl版本时报错 ruby -ropenssl -e puts OpenSSL::OPENSSL_VERSION 这是因为ruby内的openssl版本是3.2.0版本的 而自openssl3.0以后已经废弃 EC_GROUP_new_curve_GF2m了 二、解决方案 指定ruby内的openssl…

内测分发平台是否支持敏捷开发和持续集成?

大家好,我是咕噜-凯撒。敏捷开发和持续集成是软件开发中非常重要的流程和方法。内测分发平台作为应用开发和测试的关键环节需要具备这种能力。下面我简单的介绍一下敏捷开发和持续集成和提供的功能。图片来源:news.gulufenfa.com 敏捷开发是一种迭代、协…

分析:为什么有些pdf打开之后无法编辑?

pdf文件大家应该都经常接触,但是不知道大家会遇到这种情况:有些PDF文件打开之后无法编辑?是什么原因呢?今天我们来分析一下都是那些原因导致的。 首先我们可以考虑一下,PDF文件中的内容是否是图片,如果确认…

springcloud==openfeign

单独使用 创建一个服务端 import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.Path…

智能优化算法应用:基于猫群算法无线传感器网络(WSN)覆盖优化 - 附代码

智能优化算法应用:基于猫群算法无线传感器网络(WSN)覆盖优化 - 附代码 文章目录 智能优化算法应用:基于猫群算法无线传感器网络(WSN)覆盖优化 - 附代码1.无线传感网络节点模型2.覆盖数学模型及分析3.猫群算法4.实验参数设定5.算法结果6.参考文献7.MATLAB…

【傻瓜级JS-DLL-WINCC-PLC交互】3.JS-DLL进行交互

思路 JS-DLL-WINCC-PLC之间进行交互,思路,先用Visual Studio创建一个C#的DLL控件,然后这个控件里面嵌入浏览器组件,实现JS与DLL通信,然后DLL放入到WINCC里面的图形编辑器中,实现DLL与WINCC的通信。然后PLC与…

ArrayList 和 HashMap 源码解析

1、ArrayList 1.1、ArrayList 构造方法 无参创建一个 ArrayList 数组默认为空数组 transient Object[] elementData; private static final Object[] DEFAULTCAPACITY_EMPTY_ELEMENTDATA {}; private int size; // 数组容量大小public ArrayList() {this.elementData DEFA…

别太担心,人类只是把一小部分理性和感性放到了AI里

尽管人工智能(AI)在许多方面已经取得了重大进展,但它仍然无法完全复制人类的理性和感性。AI目前主要侧重于处理逻辑和分析任务,而人类则具有更复杂的思维能力和情感经验。 人类已经成功地将一些可以数据化和程序化的理性和感性特征…

传智杯-题目1

运气 一&#xff1a;对于每一的1到6都进行枚举&#xff0c;进行递归操作 二&#xff1a;如果位数到了指定的n的时候&#xff0c;递归的条件&#xff0c;进行判断是否可以整除操作 #include<iostream> #include<algorithm> using namespace std; long long n, k, an…

你要的fiddler快捷键全部在这里了,学最全的快捷键,做最快的IT程序员

一、常用三个快捷键 ctrlX :清空所有记录 CtrlF&#xff1a;查找 F12&#xff1a;启动或者停止抓包 使用 QuickExec Fiddler2 成了网页调试必备的工具&#xff0c;抓包看数据。Fiddler2自带命令行控制。 fiddler 命令行快捷键&#xff1a;ctrl q &#xff0c;然后 输入 help…

JVM运行时数据区域、对象内存分配、内存溢出异常总结

深入理解java虚拟机第二章 二、运行时数据区域2.2.1 程序计数器2.2.2 Java虚拟机栈2.2.3 本地方法栈2.2.4 Java堆2.2.5 方法区2.2.6 运行时常量池2.2.7 直接内存 三、HotSpot虚拟机对象解密2.3.1 对象的创建对象如何分配内存&#xff1f;对象的创建如何处理并发问题&#xff1f…

Flask教程入门

1.学习Flask之前&#xff0c;首先需要对URL进行一定的了解。 URL的一些知识&#xff1a; 1.URL只能包含ASCII码里面一些可显示的字符&#xff0c;如A-Z&#xff0c;a-z&#xff0c;0-9&#xff0c;&&#xff0c;#&#xff0c;%&#xff0c;&#xff1f;&#xff0c;/等字符…