int main(int argc, char* argv[])
{int i = 1;i = i + 1;return 0;
}

首先设置一个断点,然后转到反汇编

 这里的dword表示双字,即四字节,ptr表示指针。eax是一个寄存器。

假如有两个线程同时操作一个全局变量i自加,是什么样子?理想情况下应该是下面这个样子

但实际情况下(线程没有加锁的时候),有可能会是这个样子

我预期应该是i的值为12,实际却为11。

每个线程都有它自己的一组CPU寄存器和它自己的堆栈。
每个线程都有它自己的堆栈好理解。CPU的寄存器只有一组吧,如何理解每个线程都有它自己的一组CPU寄存器?

这里说的一组不是物理上的,而是逻辑上的,即每个线程都有一块地址,在线程让出CPU所有权时用来保存cpu各个寄存器的值,好在线程重新拥有cpu的时候恢复运行状态。

CPU切换前把当前任务的状态保存下来,以便下次切换回这个任务时可以再次加载这个任务的状态,然后加载下一任务的状态并执行。任务的状态保存及再加载, 这段过程就叫做上下文切换。

每个线程都有一个程序计数器(记录要执行的下一条指令),一组寄存器(保存当前线程的工作变量),堆栈(记录执行历史,其中每一帧保存了一个已经调用但未返回的过程)。

寄存器 是 CPU 内部的数量较少但是速度很快的内存(与之对应的是 CPU 外部相对较慢的 RAM 主内存)。寄存器通过对常用值(通常是运算的中间值)的快速访问来提高计算机程序运行的速度。

程序计数器是一个专用的寄存器,用于表明指令序列中 CPU 正在执行的位置,存的值为正在执行的指令的位置或者下一个将要被执行的指令的位置。

这就引出了锁。

C++:执行i++时,汇编是怎么操作的相关推荐

  1. WebApi 数据保护操作未成功。这可能是由于未为当前线程的用户上下文加载用户配置文件导致的。当线程执行模拟时,可能会出现此情况。,ExceptionType:System.Security....

    在调用System.Security.Cryptography.ProtectedData.Protect方法来保护私密信息时,IIS可能会报以下错误:CryptographicException: ...

  2. 疑难杂症--由于系统缓冲区空间不足或队列已满,不能执行套接字上的操作

    在巡检数据库时发现,数据库备份作业失败,查看错误日志发现以下提示: 已以用户 WIN2008-JH122\SYSTEM 的身份执行. Microsoft (R) SQL Server 执行包实用工具  ...

  3. MySql 一条普通的查询语句 你知道需要执行几次树的搜索操作以及会扫描多少行吗??? MySql 索引覆盖

    在码农的世界里,优美的应用体验,来源于程序员对细节的处理以及自我要求的境界,年轻人也是忙忙碌碌的码农中一员,每天.每周,都会留下一些脚印,就是这些创作的内容,有一种执着,就是不知为什么,如果你迷茫,不 ...

  4. SQL Server 由于系统缓冲区空间不足或队列已满,不能执行套接字上的操作

    1.查询分析器无法正常连接 SQL Server数据库时的错误: 由于系统缓冲区空间不足或队列已满,不能执行套接字上的操作 2.此情况一般是服务器端的端口用尽的表现,解决办法,执行以下命令行,查看端口 ...

  5. hadoop的小疑问:Map执行未结束便开始执行Reduce操作?

    关于MapReduce的一个很基本的疑问: 以入门的WordCount案列示意: 在程序执行MR的过程中,经常会在map还未执行结束时,便开始执行了reduce. map执行结束后,通过shuffer ...

  6. 如何在Lattice CPLD XO2系列器件中执行TransFR(透明传输)操作?

    向博主本人提问FPGA相关问题 转载自:如何在lattice-cpld-xo2系列器件中执行transfr透明传输操作 如何在Lattice CPLD XO2系列器件中执行TransFR(透明传输)操 ...

  7. hibernate先删除数据,紧接着执行插入时的异常解决之道——中间不能调用flush()、clear()等方法...

    hibernate先删除数据,紧接着执行插入时的异常解决之道--中间不能调用flush().clear()等方法 项目中包含这样一个寻常的业务:为某一个用户指定用户群.一个用户可以被分配到多个用户群中 ...

  8. ajax跨域jsonp并且post请求No 'Access-Control-Allow-Origin'以及执行error时readyState=4同时status=200的解决方法

    ajax跨域jsonp并且post请求No 'Access-Control-Allow-Origin'以及执行error时readyState=4同时status=200的解决方法 [网上很多网友的回 ...

  9. 打开由于被这台计算机限制而无法打开没解决,Win8打开CMD时弹出“本次操作由于这台计算机的限制而被取消如何解决...

    win8系统经常使用命令提示符(CMD)来进行一些操作,既方便又高效.有些用户在Win8 64位系统中打开CMD时弹出"本次操作由于这台计算机的限制而被取消,请与你的系统管理员联系" ...

  10. 本次操作由于这台计算机的限制而被取消 win8,Win8打开CMD时弹出“本次操作由于这台计算机的限制而被取消quot;如何解决...

    win8系统经常使用命令提示符(CMD)来进行一些操作,既方便又高效.有些用户在Win8 64位系统中打开CMD时弹出"本次操作由于这台计算机的限制而被取消,请与你的系统管理员联系" ...

最新文章

  1. Kosaraju算法(发现强连通分图算法)
  2. [智能架构系列]什么是Buddy智能开发框架
  3. XSS注入,js脚本注入后台
  4. 蜂鸣器播放青鸟,含曲谱(小萌白新文)
  5. 利用科来网络分析进行三次握手协议分析
  6. matlab和origin的区别,Matlab与Origin的区别
  7. 画java类图_java UML类图的使用
  8. IOS nonatomic 与 atomic 的区别
  9. 快乐想象识字认字注册码发放!
  10. GB28181 协议实现H5无插件RTMP/HTTP-FLV/HLS直播监控方案 - sfxlab
  11. 状态码的含义,以及HTTP中常见的状态码
  12. 微信小程序基础(全家福01)
  13. VScode前进和后退按钮,非快捷键
  14. 【随机过程】马尔可夫链(1)
  15. php使用vs,使用vs code写php及调试
  16. 大数据剖析:思科、IBM、甲骨文、Uber相继裁员,寒冬将至 ?
  17. 【Axure教程】调用b站视频播放器
  18. 影响债市行情的主要因素_影响债券市场价格的一般经济因素有哪些
  19. 高效大数乘法 c语言,C语言 简单大数乘法
  20. 2010年9月_软件学报_基于树的数据收集MAXLAT

热门文章

  1. Matlab与OpenCV对应函数
  2. 0、1、2范数与损失函数正则化
  3. OracleExcel VBA写获取表字段类型及约束语句
  4. Linux信号实践(5) --时间与定时器
  5. MySQL基础(一)介绍和配置
  6. saltstack grains
  7. 纯CSS实现移动端常见布局——高度和宽度挂钩的秘密
  8. 正确理解Python函数是第一类对象
  9. Programming Computer Vision with Python (学习笔记十二) 1
  10. Sublime配置VI插件后 快捷键总结