i++在两个线程执行100次,最终的结果是

2023-05-16

i++语句只需要执行一条指令

但当有多个线程时,并不能保证多个线程i++,操作同一个i。因为还有寄存器的因素,多个cpu对应多个寄存器。

每次要先把i从内存复制到寄存器然后++然后再把i复制到内存中,这需要至少3步。

如此,假设两个线程的执行步骤如下:

i++在两个线程中执行100次的时候,由于,对于多线程,线程共用一个内存,如果线程A在寄存器中执行了加一操作而没有写入内存,那么将会切入到另一个线程进行加一操作,在进程来回转换的过程中很可能导致原来内存中的值被覆盖,因此,此段代码执行的结果为:

最小值为:2

最大值为:200

在次范围内所有的结果都是正确的;


具体分析如下:

1.最小值的情况

线程A执行第一次i++操作,取出内存中的i,值为0;放到cpu1寄存器中执行加1操作(不写回内存),寄存器中的值为1,内存中的值为0;

线程B执行第一次i++操作,取出内存中的i,值为0;放到cpu2寄存器中执行加1操作(不写回内存),寄存器中的值为1,内存中的值为0;

线程A继续执行第99次i++,每执行一次都将其值写回内存(写了99次),此时cpu1寄存器中的值为99,内存中的值为99.

线程B由于未写回内存,继续执行第一次i++,将其值放入内存,此时cpu2寄存器中的值为1,内存中的值为1(线程B写回时覆盖了原来的99);

线程A执行第100次i++,此时cpu1寄存器中的值为2(不写入内存),内存中的值为1;

线程B继续执行完所有的操作,此时cpu2寄存器中的值为100,内存中的值为100;

此时A线程进行最后一次操作,将cpu1寄存器中的值2放入内存,此时内存中的值为2

即此操作的最小值为2;


2.最大值情况200;

最大值的情况即为当线程A和线程B进行i++时,每进行一次i++,都写入到内存当中,这样就不会存在覆盖情况,即这种情况下取得最大值200;


 

拓展:当执行 -- 操作时,思路和上面一样当i=100; 各执行50次减减操作,最终取值范围为0到98;

1、 线程A执行第一次i++,取出内存中的i,值为0,存放到寄存器后执行加1,此时CPU1的寄存器中值为1,内存中为0;(对于多线程,线程共用一个内存,如果线程A在寄存器执行操作后而没有写入内存,则会切换到另一个线程。)

2.线程B执行第一次i++,取出内存中的i,值为0;存放到寄存器中,进行加1操作,cpu2中的值为1,内存中的值为0

3、线程A继续执行完成第99次i++,并把值放回内存,此时CPU1中寄存器的值为99,内存中为99.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

i++在两个线程执行100次,最终的结果是 的相关文章

  • 面试技术杂ji——需要解决的问题

    需要搞明白的几个问题 xff1a 1 3次握手和4次挥手 2 TCP与UDP的区别 3 如果TCP连接出现问题该如何排查 xff0c 说明排查的思路 连接断开或者出错 xff0c 会返回一个错误码 xff0c errorNo 最后一次系统调
  •  SHELL 脚本学习笔记

    第十四章 SHELL 脚本 终于到 shell 脚本这章了 xff0c 在以前笔者卖了好多关子说 shell 脚本怎么怎么重要 xff0c 确实 shell 脚本在 linux 系统管理员的运维工作中非常非常重要 下面笔者就带你正式进入 s
  • 软件定义汽车 新一代技术发展

    引言 作为一个技术的爱好者 xff0c 搞算法 xff0c 玩芯片 xff0c 攒系统 xff0c 并不只是工作 xff0c 也是自己所追求的很重要的部分 写这个系列 xff0c 是为了梳理这几年的所学 所思 所想 xff0c 从而形成一个
  • 解压缩 tar命令详解

    1 tar命令进行文档的归档和压缩 归档和压缩文件 归档和压缩文件的好处 xff1a 节约硬盘的资源 xff0c 加快文件传输速率 tar命令 作用 xff1a 打包 压缩文件 xff1b tar文件是把几个文件和 xff08 或 xff0
  • 华测导航GPCHC协议ROS驱动包,CGI610、410接收机,NavSatStatus、GPSFix和普通格式

    目录 一 消息类型1 1 sensor msgs NavSatFix1 2 sensor msgs NavSatStatus1 3 gps common GPSFix1 4 sensor msgs Imu 二 部分源码2 1 相关的依赖和库
  • 淡定地撸了一遍AUTOSAR的基本概念

    1 AUTOSAR的解决方案 之前的文章 老板说项目要上AUTOSAR xff0c 我慌得一批 讲到了 xff0c 面对日益复杂的汽车E E架构 xff0c 在欧洲大地上诞生的AUTOSAR组织 xff0c 提出了解决方案 而且做了标准化
  • 图文并茂,一文讲透C语言结构体内存对齐

    面试官 xff1a 你知道C语言的结构体对齐吗 xff1f 应聘者 xff1a 听说过 平时很少关注 面试官 xff1a 好吧 xff0c 那回去等通知吧 C语言结构体对齐问题 xff0c 是面试必备问题 本文 xff0c 除了用图解的方式
  • 老板说项目要上AUTOSAR,我慌得一批

    莫慌 xff0c 淡定 xff0c 先来看看AUTOSAR是个什么鬼 AUTOSAR是什么 AUTOSAR AUTomotive Open System ARchitecture xff0c 中文是 汽车开放系统架构 xff0c 是一家致力
  • AUTOSAR架构的故事(干货)

    1 AUTOSAR架构概览 在新世纪 xff0c 汽车产业蓬勃发展 xff0c 欧洲大陆的车企们 xff0c 瞄准了这是一块大蛋糕 xff0c 于是在2002年成立了一个联盟 xff0c 搞了个叫AUTOSAR的标准 xff0c 以期一统天
  • 基于PREEvision的AUTOSAR Adaptive设计

    导读 xff1a 为适应汽车智能化 网联化等的发展趋势 xff0c 应对汽车E E系统开发面临的高性能处理器的应用 自动驾驶的软件实现 高带宽通信需求 车与外界的互联互通等的挑战 xff0c AUTOSAR组织推出了AUTOSAR Adap
  • DoIP技术

    首发于汽车控制器 ECU 网络诊断技术交流 DoIP技术 xff08 一 xff09 本文是关于DoIP技术的第一篇文章 xff0c 主要进行一些概念介绍 xff0c 具体的细节会在后续的文章中和大家探讨 DoIP是 Diagnostic
  • 车载以太网 - SOME/IP简介

    SOME IP Scalable service Oriented MiddlewarE over IP 是车载以太网通信引入的一个概念 xff0c 位于OSI 7层模型的层4 传输层 之上 在以CAN总线为主的车载网络中 xff0c 通信
  • AUTOSAR_DCM&DEM(UDS&OBD)

    1 术语与缩写 术语 DCM Diagnostic Communication Manager DEM Diagnostic Event Manager UDS Unified diagnostic services OBD On Boar
  • 精心整理的 CP AUTOSAR科普介绍材料

    一 AUTOSAR的背景介绍 AUTOSAR是AUTOmotive Open System Architecture xff08 汽车开放系统架构 xff09 的首字母缩写 xff0c 是由全球各大汽车整车厂 汽车零部件供应商 汽车电子软件
  • CP AUTOSAR 简介

    嵌入式系统不支持硬件抽象 xff0c 使得我们每次在进行新的处理器更换之后 都需要进行重新进行底层软件的开发 2003年建立autosar 组织 autosar官方文档非常长2万多页 xff0c 从这里可以看出什么 xff1f 1 auto
  • 进程概述和ps管理进程

    什么是进程 xff1a 下图所示是进程的生命周期 xff1a 简单理解 xff1a 父进程退出了子进程没有退出 xff0c 那么这些子进程就没有父进程来管理了 xff0c 就变成僵尸进程 进程的属性 xff1a 使用ps查看进程工具 xff
  • CP AUTOSAR 通信

    现在汽车中 xff0c 车内网络普遍采用CAN LIN FlexRay总线 xff0c CAN FD和车载以太网也将在未来得到更多应用 作为汽车电子软件的主要标准 xff0c AUTOSAR在总线网络通信方面提供了完整的架构 AUTOSAR
  • 二层交换机与三层交换机区别

    我们习惯说 xff0c 在二层网络环境中相同vlan之间可以通信 xff0c 不同vlan之间不可以通信 xff0c 如果想通信必须借助三层设备 xff0c 所以说三层交换机必须要做的事情是路由转发 xff0c 但是二 三层交换机具体有什么
  • Autosar 软件中间件

    我们都知道手机 xff0c 电脑啥的在应用之下 xff0c 硬件之上 xff0c 还有一个东西叫操作系统 xff0c 车辆里也有类似的东西 操作系统 xff0c 中间件 xff0c 应用软件 各司其职分工不同 操作系统 我负责对硬件 xff
  • AUTOSAR和ROS有哪些联系和区别

    AUTOSAR和ROS有哪些联系和区别 xff1f AUTOSAR和ROS有哪些联系和区别 xff1f 用ROS可以实现AUTOSAR的功能吗 xff1f 从Linux和Ros系统转向AP该如何转 xff1f 为什么需要转 xff1f AP

随机推荐

  • Autosar开发人员必知概念

    1 什么是Autosar架构 xff1f 答 xff1a 汽车开放系统架构 xff08 AUTomotive Open System Architecture xff09 是一家致力于制定汽车电子软件标准的联盟 AUTOSAR是由全球汽车制
  • Linux下source命令详解

    Linux下source命令详解 source命令用法 source FileName source命令作用 在当前bash环境下读取并执行FileName中的命令 注 xff1a 该命令通常用命令 来替代 使用范例 xff1a sourc
  • CMakeLists.txt 语法介绍与实例演练

    一 Cmake 简介 cmake 是一个跨平台 开源的构建系统 它是一个集软件构建 测试 打包于一身的软件 它使用与平台和编译器独立的配置文件来对软件编译过程进行控制 二 常用命令 1 指定 cmake 的最小版本 cmake minimu
  • tar 解压缩命令详解

    tar 解压缩命令详解 以下是对tar命令的一些总结 xff1a tar cvf test tar test 仅打包 xff0c 不压缩 tar zcvf test tar gz test 打包后 xff0c 以gzip压缩 在参数f后面的
  • 嵌入式Linux应用开发---GCC程序编译

    电脑编程就是一个 翻译 过程 xff0c 要把用户的程序翻译成CPU指令 xff0c 其实也就是机器代码 所谓的机器代码就是用CPU指令书写的程序 xff0c 被称作低级语言 而程序员的工作就是编写出机器代码 由于机器代码完全是一些数字组成
  • 嵌入式Linux应用开发---Makefile工程管理

    GUN make Linux程序员必须要学会GUN make 来构建和管理自己的软件工程 GUN 的make能够使整个软件工程的编译 链接只需要一个命令就可完成 make 在执行时 xff0c 需要一个命名为Makefile的文件 Make
  • uptime查看系统负载 -top动态管理进程

    一 uptime 查看系统负载 top动态管理进程 1 uptime 查看cpu负载工具 span class token punctuation span root span class token annotation punctuat
  • 嵌入式Linux应用开发---Linux文件编程

    系统调用 文件访问 库函数 文件访问 时间编程 Linux中文件编程可以使用两种方法 xff1a Linux系统调用 C C 43 43 语言库函数 前者依赖于Linux系统 xff0c 后者与操作系统是独立的 xff0c 在任何操作系统下
  • 嵌入式Linux应用开发---进程控制理论基础

    进程控制理论基础 进程是一个具有一定独立功能的程序的一次运行活动 特点 xff1a 动态性并发性独立性异步性 进程ID 进程ID xff08 PID xff09 xff1a 标识进程的唯一数字 父进程的ID xff08 PPID xff09
  • 嵌入式Linux应用开发---进程通信 管道

    目录 进程间通信概述 管道通信 信号通信 共享内存 进程间通信概述 为什么需要进程间通信 xff1f 数据传输 xff1a 一个进程需要将它的数据发送给另一个进程资源共享 xff1a 多个进程之间共享相同的资源 事件通知 xff1a 一个进
  • QNX操作系统简介

    前言 说到操作系统 xff0c 先来列举一些 UNIX 和 类Unix 操作系统 分类操作系统UNIX System V家族A UX AIX HP UX IRIX LynxOS SCO OpenServer Tru64 Xenix Sola
  • 虚拟化技术介绍 & hypervisor简介

    什么是虚拟化 xff1f 虚拟化 xff08 英语 xff1a Virtualization xff09 是一种资源管理技术 xff0c 是将计算机的各种实体资源 xff0c 如服务器 网络 内存及存储等 xff0c 予以抽象 转换后呈现出
  • 什么是ARA?它由什么组成?

    什么是ARA xff1f 它由什么组成 xff1f 什么是Machine xff1f Machine与ECU之间的关系是怎么样的 xff1f Execution Manifest 的作用是什么 xff1f Execution Managem
  • 从工程师的角度看AUTOSAR

    软件定义汽车 的火热带动了工程师们对于汽车电子软件热烈地讨论 不曾想到 xff0c 隐藏在控制器内部 xff0c 默默地发挥着作用的汽车电子软件 xff0c 如今备受瞩目 本人毕业到现在 xff0c 一直在汽车行业做软件 xff0c 切身感
  • 车载以太网SOME/IP概述

    车载以太网SOME IP概述 汽车测试技术 汽车测试网 车载以太网SOMEIP概述 xff08 二 xff09 汽车技术 汽车测试网 The error handling of SOME IP is shown as an example
  • 基于模型的嵌入式软件开发

    对工具的分类和资质审核 通过认证的方式发放证书 应对复杂系统时 xff0c 软件开发人员的工作效率在降低 解决复杂软件开发效率低下的路径 xff1a 模块化开发 xff08 一个复杂的系统包含很多模块 xff0c 每个模块都比较简单 xff
  • ARM Cortex-A系列处理器性能分类比较

    在如今这个电子产品泛滥的年代 xff0c 仅仅靠品牌或是外观已经不足以辨别产品的优劣 xff0c 其内置的处理器自然也就成为了分辨产品是否高端的标准之一 那么我们今天就不妨好好了解一下近几年来电子产品中较为主流的RAM处理器 在这之前让我们
  • linux 前后台进程详解

    前后台进程切换 nice 进程优先级 free 实战 screen 后台执行命令 linux 前台进程与后台进程的区别 xff1a 进程的前台与后台运行 跟系统任务相关的几个命令 xff1a 注 xff1a 实际生产环境中 xff0c 都是
  • 编写项目工作说明书(SOW)

    工作说明书 SOW 是一个项目必须提供的工作指南 SOW是一个关键的管理工具 xff0c 不管是用来指导卖方或者承包商的工作 xff0c 或者是用来指导他们的内部工作 xff0c SOW必须包括所有所期望工作的描述 这些描述不需要在一个很详
  • i++在两个线程执行100次,最终的结果是

    i 43 43 语句只需要执行一条指令 但当有多个线程时 xff0c 并不能保证多个线程i 43 43 xff0c 操作同一个i 因为还有寄存器的因素 xff0c 多个cpu对应多个寄存器 每次要先把i从内存复制到寄存器 xff0c 然后