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

对于volatile的看法

volatile原意是易变的,编译器对volatile修饰的变量,当要读取这个变量时,任何情况下都会从内存中读取,而不会从寄存器缓存中读取。
编译器不会对volatile修饰的变量进行任何优化

1)非volatile变量在这里插入图片描述

在这个用例中,非volatile变量a,b,c全部被编译器优化掉了 (optimize out),因为编译器通过分析,发觉a,b,c三个变量直接用立即数替换,不必存在内存中。最后的汇编代码相当简介,高效率

2)volatile变量

在这里插入图片描述
在这个用例中,a、b、c三个变量,都是volatile变量。在汇编语言中,这三个变量存到了内存中,在使用a、b、c时需要将三个变量从内存读入到寄存器之中,然后再调用printf()函数

顺序性

1)程序的乱序优化:保证一段代码的输出结果的前提下,将各条代码的实际执行顺序进行优化调整
volatile变量与volatile变量间代码的顺序,编译器不会进行乱序优化,但是volatile变量与非volatile变量代码的顺序,编译器不保证顺序,可能会进行乱序优化

volatile不能保证多线程中竞争

C/C++多线程编程中不要使用volatile。(注:这里的意思指的是指望volatile解决多线程竞争问题是有很大风险的,除非所用的环境系统不可靠才会为了保险加上volatile,或者是从极限效率考虑来实现很底层的接口。这要求编写者对程序逻辑走向很清楚才行,不然就会出错)
C++11标准中明确指出解决多线程的数据竞争问题应该使用原子操作或者互斥锁。C和C++中的volatile并不是用来解决多线程竞争问题的,而是用来修饰一些因为程序不可控因素导致变化的变量,比如访问底层硬件设备的变量,以提醒编译器不要对该变量的访问擅自进行优化。
对访问共享数据的代码块加锁,已经足够保证数据访问的同步性,再加volatile完全是多此一举。如果光对共享变量使用volatile修饰而在可能存在竞争的操作中不加锁或使用原子操作对解决多线程竞争没有任何卵用,因为volatile并不能保证操作的原子性,在读取、写入变量的过程中仍然可能被其他线程打断导致意外结果发生。

相关文章:

  • 百度上能收到的企业名称网站怎么做/免费培训机构
  • 成都网架公司/seo搜索优化 指数
  • 佛山新网站制作特色/北京优化核酸检测
  • 东莞建网站/全国新冠疫苗接种率
  • 网站优化的学习/java培训班
  • wordpress微信网站/企业网站营销实现方式解读
  • 【学习笔记】《Python深度学习》第一章:什么是深度学习
  • 第五节:方法的使用【java】
  • 计算机毕业设计(附源码)python疫情下校园食品安全信息管理
  • 猿创征文|程序员都应该了解的十款开发神器
  • Centos下部署CodiMD
  • 计算机中的 原码、反码、补码 详解
  • 学长教你学C-day7-C语言指针
  • 移动测试Appium安装
  • STM32CubeIDE 操作 LCD1602
  • 项目管理之变更管理
  • 互联网摸鱼日报(2022-11-03)
  • 2023转行要趁早!盘点网络安全的岗位汇总