当前位置: 首页 > article >正文

volatile 关键字的作用学习

转自: chatgpt

1.介绍

在 C++ 中,volatile 关键字的作用是告诉编译器一个变量的值可能在任何时刻被外部因素改变,编译器不能对其进行优化。这对于那些可能由硬件、其他线程或信号处理程序更改的变量特别有用。

当一个变量被声明为 volatile 时,编译器在每次访问这个变量时,都会强制读取该变量的最新值,而不会对其进行缓存或优化读取。例如:

volatile int flag;

这样定义的 flag,编译器每次都会从内存中读取它的值,而不会依赖寄存器中的缓存值。

2. 应用场景

volatile 关键字常见于以下几种情况:

  • 硬件寄存器:当一个变量对应硬件设备的寄存器时,硬件设备可以随时改变这个变量的值。例如,与内存映射的 I/O 设备进行交互时,寄存器的值可能在程序之外的环境下改变。

  • 多线程编程:在多线程编程中,一个线程可能会改变一个全局变量,而另一个线程需要感知到这个变化。通过声明该变量为 volatile,可以确保其他线程总是能读取到变量的最新值。

  • 信号处理程序:当使用信号处理程序(如 signal())时,变量可能会在信号处理程序中异步更改,因此需要声明为 volatile

3.例子

volatile bool flag = false;

void checkFlag() {
    while (!flag) {
        // 等待 flag 被设置为 true
        // 编译器不会优化这段代码
    }
}

void setFlag() {
    flag = true;  // 在另一个线程中设置 flag
}

在这个例子中,flag 变量可能会被另一个线程改变。如果没有 volatile,编译器可能会优化代码,将 flag 的值缓存到寄存器中,导致线程无法及时感知到另一个线程对 flag 的更改。而加了 volatile 后,每次都会重新从内存中读取 flag 的值。

volatile 可以和 const 一起使用。这意味着 sensorValue 的值可能随时被外部硬件更改(volatile),但代码本身不能更改它(const)。

4.注意事项

  • volatile 并不保证线程安全:它只是防止编译器优化对变量的访问,而不会防止数据竞争。如果多个线程并发访问或修改同一变量,还需要其他同步机制(如 mutex)来确保线程安全。
  • 不适用于所有优化场景volatile 只能防止编译器对变量的优化,但不会影响 CPU 层面的优化。因此,对于多线程同步,通常还需要 atomic 或内存屏障等手段。

http://www.kler.cn/news/362387.html

相关文章:

  • pdf编辑软件有哪些?方便好用的pdf编辑软件分享
  • Linux中如何理解一切皆文件
  • 10. 异常处理器
  • 【牛客刷题】笔记2
  • 物理海洋随学笔记(一)
  • MFC工控项目实例二十五多媒体定时计时器
  • 中小企业如何做大做强?
  • Cadence元件A属性和B属性相互覆盖
  • k8s集群安装
  • 2024/10/23 (easycovery密匙激活码为什么这么贵)
  • 调查显示软件供应链攻击增加
  • 知识问答网站毕业设计基于SpringBootSSM框架
  • git tag 用法
  • Spring Boot在线考试系统:JavaWeb技术的应用案例
  • 使用Redisson的布隆过滤器解决缓存穿透问题
  • 深入探索JavaScript异步编程:Promise与async/await的实现原理与应用
  • 如何获得Linux系统
  • 人工智能:引领未来的科技革命
  • 整理—Redis
  • MySQL-27.多表查询-案例
  • Cesium for UE-04-一些说明
  • Linux基础项目开发day05:量产工具——页面系统
  • 鹏哥C语言81-82---指针和数组+二级指针+指针数组
  • CentOS7安装RabbitMQ-3.13.7、修改端口号
  • PHP While 循环
  • 数组扁平化 JS代码实现 + 常用数组方法(未完)