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

volatile不等于原子操作

volatile作用

确保数据每次都从源头读取,即每次都从内存中读取,不从缓存中读取。
这样做的目的是确保不会被优化

int i = 0;int main(int argc, char **argv)
{const char *str;if (i == 0) {str = "hello";} else {str = "world";}return 0;
}

如上一段代码,从main中可以确定i一定等于0,所以在优化后就会直接让str = "hello";
但是其他线程可能会修改i的值,这样就会出错。加上volatile这段比较代码就不会被优化

volatile为什么不等于原子操作

1、修改一个变量的值会经过以下三个步骤

  1. 从内存读取值 ( R )
  2. 在算术逻辑单元ALU进行计算 ( M )
  3. 将计算后的值写回内存 ( W )

两个线程都对加上volatile的整形变量x累加,初始值为0

  1. p1读取到x的值
  2. p1对x进行累加
  3. p2读取x的值
  4. p1将x写回内存
  5. p2对x进行累加
  6. p2将x写回内存

最终结果x将会是1,显然是错误的
可以让p1读取前先锁定内存总线,在写完后释放内存总线

http://www.lryc.cn/news/9043.html

相关文章:

  • 每天10个前端小知识 【Day 15】
  • 异构数据库同步方案
  • MySQL-系统信息函数
  • Windows环境下使用Pycharm运行sh文件
  • Flutter启动流程浅析
  • 004:NumPy的应⽤-2
  • 一文了解JAVA中同步、异步、阻塞和非阻塞
  • 查询股票交易日接口可以用C++实现查询当日成交吗?
  • java中常见的json库以及对应的用法
  • 德赛西威NAV75*-SV731*导航升级(凯立德J30)实战
  • [USACO2023-JAN-Bronze] T1 LEADERS 题解
  • 第二章:unity性能优化之drawcall优化-1
  • 【2341. 数组能形成多少数对】
  • [TPAMI‘21] Heatmap Regression via Randomized Rounding
  • pytorch下tensorboard使用[远程服务器]
  • CentOS下安装Nginx的详细步骤
  • CSS编码规范
  • Linux下makefile 编译项目
  • Linux磁盘查看,使用(分区、格式化、挂载)
  • 走进WebGL
  • Unity 中 Awake 和 Start 时机与 GameObject的关系
  • 1月份 GameFi 行业报告
  • JVM - 调优
  • flask配置https协议
  • Springboot 我随手封装了一个万能的导出excel工具,传什么都能导出
  • 【Linux详解】——进程控制(创建、终止、等待、替换)
  • HummerRisk V0.9.1:操作审计增加百度云,增加主机检测规则及多处优化
  • Rust入门(十六):手写web服务器和线程池
  • 数据结构——第二章 线性表(1)——顺序结构
  • YOLO 格式数据集制作