C语言中volatile关键字的用法

在C语言中,volatile 是一个类型修饰符。它告诉编译器,被修饰的变量可能会在程序的控制或知识之外被改变。这通常发生在以下几个情况:

  1. 硬件寄存器的映射。
  2. 由不同线程在多线程程序中访问的变量。
  3. 信号处理程序中的变量。

使用 volatile 告诉编译器不应优化掉这些变量的读写,因为它们可能会突然改变,而这种改变是编译器无法预测的。这确保了每次访问 volatile 变量都会直接从它的实际内存地址读取,而不是从可能已经不同步的寄存器或其他缓存中读取。

使用 volatile 的正确性和需要它的场合通常涉及到硬件和并发编程。下面进一步介绍几个 volatile 关键字的用途和一些注意事项:

嵌入式编程

在嵌入式系统编程中,volatile 经常被用于访问由硬件事件更新的内存。例如,一个硬件计时器可能会更新一个内存位置,表示计时器的值。由于硬件会改变这个值,而且这种变化是异步的(即编译器和程序流程无法预测的),因此这个变化应通过 volatile 变量来读取:

volatile uint32_t *timer = (volatile uint32_t *)0x10000000;
uint32_t timer_value;timer_value = *timer; // 读取硬件计时器的值

上面的代码示例中,指针 timer 指向一个硬件计时器的内存映射地址,volatile 修饰确保直接从硬件地址读取值。

多线程及中断服务程序

在多线程环境或中断服务程序(ISR)中,多个事件可能会并发修改变量。为了保证变量状态的可见性,这些变量需要被声明为 volatile

volatile bool data_ready = false;void interrupt_service_routine(void) {// ...data_ready = true;
}void main_thread(void) {while (!data_ready) {// 等待数据准备好}// 处理数据
}

在这个例子中,中断服务程序更新一个标志位,表明数据已经准备好,而主线程在标志位变成真时开始处理数据。

注意事项

  • 使用 volatile 并不能保证变量访问的原子性。在多线程环境中,除了 volatile,还需要使用互斥量或原子操作才能安全地进行同步。
  • volatile 不应被用作优化代码的手段,只有在遇到特定的硬件相关编程或多线程并发访问的场景下才需要使用它。
  • volatile 不能取代内存栅栏或其他同步机制用于保证指令执行顺序。

总的来说,当你确信变量可由程序外部改变,且每次访问时都必须重新从内存中读取时,应使用 volatile 关键字。这确保了程序的正确性和对外部变化的响应性。在现代编译器中,滥用或错误使用 volatile 可能导致性能问题,因此要小心谨慎地使用。

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

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

相关文章

华为配置中心AP内漫游实验

华为配置中心AP内漫游示例 组网图形 图1 配置中心AP内漫游组网图 配置流程组网需求配置思路数据规划配置注意事项操作步骤配置文件 配置流程 WLAN不同的特性和功能需要在不同类型的模板下进行配置和维护,这些模板统称为WLAN模板,如域管理模板、射频模…

Mybatis获取主键值

1. 自增长类型主键 如果数据库表设置了主键自增长,那么我们在插入数据时,不需要给主键赋值。那么如果我们需要获取该主键的值该怎么办呢? 获取方法如下: Mapper接口中的抽象方法, int insertEmployee(Employee emp…

Spring Cloud Gateway针对指定接口做响应超时时间限制

背景:我做的这个服务中存在要对大数据量做自定义统计的接口和大文件上传接口,接口响应用时会超过gateWay配置的全局用时,如果调整网关全局的超时时间和服务的全局超时时间是不合理的,故此想能否单独针对某个接口进行细粒度超时限制…

林木园区改造VR仿真培训课件提高人们的专业素质

森林经营VR模拟体验摆脱了传统森林经营周期长、实践难及耗材大等问题,借助VR虚拟仿真技术为人们提供一种全新的、沉浸式的森林经营体验,让人们更好地了解森林经营的全周期。 提高人们的环保意识 通过亲身参与森林经营的过程,人们可以更直观地…

honoka的键盘

honoka的键盘 题目背景 honoka 有一个只有两个键的键盘。 题目描述 一天,她打出了一个只有这两个字符的字符串。当这个字符串里含有 VK 这个字符串的时候,honoka 就特别喜欢这个字符串。所以,她想改变至多一个字符(或者不做任…

MFC中CString类都有哪些成员函数,分别什么作用,如何使用它们?

参考地址:https://learn.microsoft.com/zh-cn/cpp/atl-mfc-shared/reference/cstringt-class?viewmsvc-170 CString 类在 MFC(Microsoft Foundation Classes)中提供了丰富的成员函数来操作和处理字符串。以下是一些主要的 CString 成员函数…

4、鸿蒙学习-@ohos.promptAction (弹窗)

创建并显示文本提示框、对话框和操作菜单。 说明 本模块首批接口从API version 9开始支持。后续版本的新增接口,采用上角标单独标记接口的起始版本。 该模块不支持在UIAbility的文件声明处使用,即不能在UIAbility的生命周期中调用,需要在创建…

关于python中数据分析的一些函数

首先先下载numpy函数库 如果使用的pycharm软件,可在设置中下载,在Python interpreter设置里,点击号,搜索numpy点击下载即可 第一部分 1.array()函数 这是一个将类似数组的数据转为数组的函数,我们还可以控制其数组的…

【Unity】程序创建Mesh(二)MeshRenderer、光照、Probes探针、UV信息、法线信息

文章目录 接上文MeshRenderer(网格渲染器)Materials(材质)Material和Mesh对应Lighting光照Lightmapping材质中的光照 光源类型阴影全局光照Probes(探针)Ray Tracing(光线追踪)Additi…

【C++】map和set深度讲解

> 作者简介:დ旧言~,目前大二,现在学习Java,c,c,Python等 > 座右铭:松树千年终是朽,槿花一日自为荣。 > 目标:熟练掌握map和set容器。 > 毒鸡汤:…

【 React 】在React 项目是如何捕获错误的?

1. 是什么 在react项目中去编写组件内JavaScript代码错误会导致React的内部状态被破坏,导致整个应用崩溃,这是不应该出现的现象 作为一个框架,react也有自身对于错误的处理的解决方案 2. 如何做 为了解决出现的错误导致整个应用崩溃的问题&a…

升入理解计算机系统学习笔记

磁盘存储 磁盘是广为应用的保存大量数据的存储设备,存储数据的数量级可以达到几百到几千千兆字节,而基于RAM的存储器只能有几百或几千兆字节。不过,从磁盘上读信息的时间为毫秒级,比从DRAM读慢了10万倍,比从SRAM读慢了…

NodeJs利用腾讯云实现手机发送验证码

本文介绍如何在nodejs实现短信发送,以腾讯云的短信验证为例。 腾讯云中准备工作 首先需要腾讯云的个人或者企业认证的账号,个人会赠送一百条,企业赠送一千条,可以用于测试,地址:腾讯云短信服务。然后需要…

latex中参考文献的集中表示方式

LaTeX的参考文献比较麻烦,入手也较慢,一直以来都是运用直接法,特别死板,跟word手打比除了自动排序外没有什么优势。 换成一体机后,借着新装的texworks editor和texstudio,好好的把各种参考文献的使用方法弄明白。 最简单的——直接直接写在文档尾部 直接在把格式排好的参…

Copilot with GPT-4与文心一言4.0:AI技术的未来

Copilot with GPT-4的深度分析 Copilot with GPT-4是基于OpenAI的GPT-4模型,它是一个多功能的AI助手,能够在多种语言中进行交流和创作。GPT-4模型的强大之处在于其庞大的数据训练基础,这使得它在理解语境、生成文本以及执行复杂任务方面表现…

《Ubuntu20.04环境下的ROS进阶学习5》

一、Hector_Mapping构建二维地图 在前面我们已经介绍了如何使用激光雷达来扫描地图,如何用激光雷达来建造地图,本节我们将两者结合起来,通过Hector_Mapping功能包实现SLAM。 二、在仿真环境中进行2D SLAM 1、下载Hector_Mapping sudo apt i…

【论文阅读笔记】Attention Is All You Need

1.论文介绍 Attention Is All You Need 2017年 NIPS transformer 开山之作 回顾一下经典,学不明白了 Paper Code 2. 摘要 显性序列转导模型基于包括编码器和解码器的复杂递归或卷积神经网络。性能最好的模型还通过注意力机制连接编码器和解码器。我们提出了一个新…

【Numpy】练习题100道(26-50题)

#学习笔记# 在学习神经网络的过程中发现对numpy的操作不是非常熟悉,遂找到了Numpy 100题。 Git-hub链接 1.题目列表 26. 下面的脚本输出什么?(★☆☆) print(sum(range(5),-1)) from numpy import * print(sum(range(5),-1)) 27. 考虑一个整数向量…

怎样提升小程序日活?签到抽奖可行吗?

一、 日活运营策略 小程序应该是即用即走的,每个小程序都在用户中有自己的独特定位,可能是生活日常必备(美食、团购、商城),也可能是工作办公必备(文档、打卡、工具)。 如果你想要让自己的小程…

云计算与APP开发,如何利用云端服务提升应用性能?

随着移动应用程序(APP)的普及,如何提升应用性能成为了开发者们关注的重点之一。而云计算技术的发展为APP开发者提供了全新的解决方案。本文将探讨云计算与APP开发的结合,以及我们公司提出的解决方案,帮助开发者利用云端…