博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
线程1: i++; i++; 线程2: i+=2; 的问题 (2013年某公司笔试题目)
阅读量:4141 次
发布时间:2019-05-25

本文共 760 字,大约阅读时间需要 2 分钟。

       题目:

全局的int i = 0;

线程1: i++; i++; 

线程2: i+=2; 

 

     问: 最后i的取值可能是()

a. 1    b. 2.    c   3     d  4

 

       首先我们就可以断定, a肯定不对, 无论线程怎么走, 总会执行 i+=2, 怎么可能加着加着就成了1呢, 那不是变少了么?

 

       我们先看程序:

 

#include 
int main(){ int i = 0; i++; return 0;}

      好, 我们来看看汇编代码:

 

 

        我们看到, i++其实并不是原子操作, 而是要经历3个步骤, 这三个步骤都是可以被线程打断的。 有的朋友可能不太熟悉汇编, 没关系, 我来解释一下, 上面三个语句的作用分别是:

     1. 把内存i的值放到寄存器eax中;

     2. eax中的值加1

     3. 然后把eax的值又返回到内存i中

 

       下面, 我们来做做这个题目:

        假设先执行完线程1, 再执行线程2, 那结果必然是4, 这个很简单吧。

 

        假设先执行线程1的i++; 那么此时i的值就是1了, 然后再执行i+=2,  别忘了, i+=2需要分三个步骤, 假设在执行这三个步骤的过程中被线程1打断(此时, 线程2的eax是3, 但还没有返回给i), 那么线程1会继续执行i++, 执行完后i的值是2,  随后, 线程2的eax中的3返回给i (把线程1产生的2这个值给覆盖掉了),  所以, 随后i的值为3.

 

        假设线程2先执行, 在执行i+=2的时候, 被线程1打断(此时, i的值是0,  线程2的eax的值是2, 但还没有来得及返回给i), 然后线程1执行i++和i++后, i的值是2, 随后, 线程2的eax中的2返回给i,  所以, i的值为2.

 

        所以, 该题目选bcd.

 

         这类题目其实很简单, 多分析一下就可以了, 是必须要拿分的啊微笑

 

 

 

 

      

你可能感兴趣的文章
这才是学习Vite2的正确姿势!
查看>>
7 个适用于所有前端开发人员的很棒API,你需要了解一下
查看>>
25个构建Web项目的HTML建议,你需要了解一下!
查看>>
【web素材】02-10款大气的购物商城网站模板
查看>>
6种方式实现JavaScript数组扁平化(flat)方法的总结
查看>>
49个在工作中常用且容易遗忘的CSS样式清单整理
查看>>
20种在学习编程的同时也可以在线赚钱的方法
查看>>
隐藏搜索框:CSS 动画正反向序列
查看>>
127个超级实用的JavaScript 代码片段,你千万要收藏好(上)
查看>>
【视频教程】Javascript ES6 教程27—ES6 构建一个Promise
查看>>
【5分钟代码练习】01—导航栏鼠标悬停效果的实现
查看>>
127个超级实用的JavaScript 代码片段,你千万要收藏好(中)
查看>>
127个超级实用的JavaScript 代码片段,你千万要收藏好(下)
查看>>
【web素材】03-24款后台管理系统网站模板
查看>>
Flex 布局教程:语法篇
查看>>
年薪50万+的90后程序员都经历了什么?
查看>>
2019年哪些外快收入可达到2万以上?
查看>>
【JavaScript 教程】标准库—Date 对象
查看>>
前阿里手淘前端负责人@winter:前端人如何保持竞争力?
查看>>
【JavaScript 教程】面向对象编程——实例对象与 new 命令
查看>>