线程1: i++; i++; 线程2: i+=2; 的问题 (2013年某公司笔试题目)
2015-05-20 22:52
267 查看
题目:
全局的int i = 0;
线程1: i++; i++;
线程2: i+=2;
问: 最后i的取值可能是()
a. 1 b. 2. c 3 d 4
首先我们就可以断定, a肯定不对, 无论线程怎么走, 总会执行 i+=2, 怎么可能加着加着就成了1呢, 那不是变少了么?
我们先看程序:
我们看到, 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.
这类题目其实很简单, 多分析一下就可以了, 是必须要拿分的啊
。
全局的int i = 0;
线程1: i++; i++;
线程2: i+=2;
问: 最后i的取值可能是()
a. 1 b. 2. c 3 d 4
首先我们就可以断定, a肯定不对, 无论线程怎么走, 总会执行 i+=2, 怎么可能加着加着就成了1呢, 那不是变少了么?
我们先看程序:
#include <stdio.h> 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.
这类题目其实很简单, 多分析一下就可以了, 是必须要拿分的啊
。
相关文章推荐
- 线程1: i++; i++; 线程2: i+=2; 的问题 (2013年某公司笔试题目)
- 各大计算机公司 笔试及面试 题目 - 联发科(内核线程、轻量级进程、用户线程和LinuxThreads库)
- C++内存问题(很多公司面试的题目,值得一看,看懂了别忘了告诉我)
- 各大计算机公司 笔试及面试 题目 - 阿里巴巴、深信服(Linux的启动流程 V3)
- 分享一道笔试题目--关于static和extern变量的问题
- 小米2014年校园招聘笔试题目(排队问题)
- 各大计算机公司 笔试及面试 题目 - 百度(一)
- 据说是一个著名公司的笔试题目
- 一个公司的笔试题目
- 2011 各大IT公司笔试面试题目
- ZigZag排列问题与经典笔试面试题目解析
- Hulu 2013年校招笔试题目及答案求解(转)
- C++内存问题(很多公司面试的题目,值得一看,看懂了别忘了告诉我)
- 某知名公司笔试题目
- 腾讯在线模拟笔试题目,格雷码问题
- 大型公司笔试题目汇总(2)——网易计算机类笔试题目
- 2011 各大IT公司笔试面试题目
- 2013年网易春季实习生招聘笔试题目
- 各个公司笔试题目集锦
- 聊聊map和vector的迭代器失效问题(某公司招聘笔试试题)