当前位置:网站首页>C语言中volatile的使用
C语言中volatile的使用
2022-04-23 05:50:00 【tilblackout】
volatile关键字的意思为易变的,提醒编译器从变量地址中读取数据,而不是有时优化为暂时使用寄存器中的值。如果变量由别的程序或函数更新,特别是在中断中修改的话,编译器很可能会优化变量,将出现不一致的现象。
比如说在中断中修改一个变量的值,但中断什么时候触发编译器并不知道,那编译器就会以为那段代码不会执行,从而优化掉。那volatile就告诉编译器这个变量是易变的,不要优化它。
指令重排序的概念:
static int num = 0;
线程1:
num = 2;
ready = true;
线程2:
if (ready)
printf("%d",num);
-----------------------------------
在两个线程中,是没有数据依赖性的,可能线程1的执行顺序会变为
ready = true;
num = 2;
就会导致线程2输出默认的0
而加volatile关键字后,会在写操作后加store屏障指令,读操作前加入load屏障,防止指令重排序总结:
- 中断服务程序中修改的供其它程序检测的变量需要加volatile;
- 多任务环境下各任务间共享的标志应该加volatile;
- 存储器映射的硬件寄存器通常也要加volatile说明,因为每次对它的读写都可能有不同意义;
版权声明
本文为[tilblackout]所创,转载请带上原文链接,感谢
https://blog.csdn.net/tilblackout/article/details/121866519
边栏推荐
猜你喜欢
Programmers can also write novels
【UDS统一诊断服务】四、诊断典型服务(3)— 读故障信息功能单元(存储数据传输功能单元)
Qt 给应用程序加图标
基于Keras的时装分类案例
Cross domain issues - allow origin header contains multiple values but only one is allowed
[UDS unified diagnostic service] II. Network layer protocol (1) - overview and functions of network layer
[UDS unified diagnostic service] IV. typical diagnostic service (5) - function / component test function unit (routine function unit 0x31)
【UDS统一诊断服务】(补充)五、ECU bootloader开发要点详解 (2)
Graduation project, viewing screenshots of epidemic psychological counseling system
卷积神经网络实现CIFAR100数据集分类
随机推荐
Friend function, friend class, class template
ArcGIS表转EXCEL超出上限转换失败
产生随机数
[UDS unified diagnostic service] II. Network layer protocol (2) - data transmission rules (single frame and multi frame)
TP download folder, compress folder and download
非参数化相机畸变模型简介
Qt 添加QSerialPort类 实现串口操作
C语言实用小技巧合集(持续更新)
爬取彩票数据
The waterfall waterfall flow of uview realizes single column and loads more
识别验证码
vs中能编译通过,但是会有红色下划线提示未定义标示符问题
【UDS统一诊断服务】四、诊断典型服务(1)— 诊断和通信管理功能单元
ArcGIS license错误-15解决方法
利用文件保存数据(c语言)
【UDS统一诊断服务】二、网络层协议(1)— 网络层概述与功能
【UDS统一诊断服务】一、诊断概述(1)— 诊断概述
Swagger2 generates API documents
C语言进阶要点笔记2
[UDS] unified diagnostic service (UDS)