两个线程并发执行以下代码,假设a是全局变量,那么以下输出___哪个是可能的?
2017-11-01 13:19
363 查看
1
2
3
4
5
假设线程x和y同时执行,x和y可随时被抢占,a的初始值为1
A:3, 2
y先执行++a,a为2;
y再执行printf,a入栈,在打印到终端之前切换到x
x执行++a,a为3;
x执行printf,输出3;再切换到y
y执行打印,输出2
B:2 3
x先执行++a,a为2;
x再执行printf,输出2;切换到y
y执行++a,a为3;
y执行printf,输出3;
C:3 3
x先执行++a,a为2;切换到y
y执行++a,a为3;
y执行printf,输出3;切换到x
x执行printf,输出3
D:2 2
类似C, 执行++a操作但没有写回到内存
这里关键有两点:
(1)两个线程可随时被抢占
(2)++a和printf不是原子指令,可随时被打断;特别注意函数printf,a作为参数压栈后,a再变化则不会影响输出(printf实际打印的是压栈的参数,是值拷贝的栈变量)
2
3
4
5
解析
假设线程x和y同时执行,x和y可随时被抢占,a的初始值为1A:3, 2
y先执行++a,a为2;
y再执行printf,a入栈,在打印到终端之前切换到x
x执行++a,a为3;
x执行printf,输出3;再切换到y
y执行打印,输出2
B:2 3
x先执行++a,a为2;
x再执行printf,输出2;切换到y
y执行++a,a为3;
y执行printf,输出3;
C:3 3
x先执行++a,a为2;切换到y
y执行++a,a为3;
y执行printf,输出3;切换到x
x执行printf,输出3
D:2 2
类似C, 执行++a操作但没有写回到内存
这里关键有两点:
(1)两个线程可随时被抢占
(2)++a和printf不是原子指令,可随时被打断;特别注意函数printf,a作为参数压栈后,a再变化则不会影响输出(printf实际打印的是压栈的参数,是值拷贝的栈变量)
相关文章推荐
- 两个线程并发执行以下代码,假设a是全局变量,那么以下输出___哪个是可能的?
- 两个线程并发执行以下代码,假设a是全局变量,初始为1,那么以下输出______是可能的?
- 两个线程并发执行以下代码,假设a是全局变量,那么以下输出______是不可能的?
- 以下代码在执行的时候,有时会打印出5行甚至6行输出,为什么?(VC6.0)
- 线程间无需特别的手段进行通信,因为线程间可以共享数据结构,也就是一个全局变量可以被两个线程同时使用,不过要注意的是线程间需要做好同步。
- Java 多线程中。两个线程交替执行,一个输出偶数,一个输出奇数(方法一)
- 关于360笔试题的一个题目的以下代码执行后输出结果为()思考
- Java 多线程实现的三种方法,附两个线程执行不同的输出
- volatile变量在多线程同步时运用的优点: 1、锁一次只允许一个线程访问值,volatile 允许多个线程执行读操作,因此当使用 volatile 保证读代码路径时,要比使用锁执行全部代码路径获得
- 求开4个线程4秒内执行完以下程序;部分代码已标注不能修改(多线程)
- 输入两个整数序列。其中一个序列表示栈的push顺序,判断另一个序列有没有可能是对应的pop顺序。为了简单起见,我们假设push序列的任意两个整数都是不相等的。 比如输入的push序列是1、2、3、4、5,那么4、5、3、2、1就有可能是一个pop系列。
- 关于线程并发访问全局变量问题
- GCD的定义及使用详解(同步异步、并发串行、线程间通信、延时执行、只执行一次代码)
- 在Linux 系统中,在运行一个程序时,程序中未初始化的全局变量会被加载到以下哪个内存段中?
- Java 多线程中。两个线程交替执行,一个输出偶数,一个输出奇数
- 面试必问!Java 多线程中两个线程交替执行,一个输出偶数,一个输出奇数
- [js]js代码执行顺序/全局&私有变量/作用域链/闭包
- Java线程重复执行以及操作共享变量的代码示例
- Java 多线程中。两个线程交替执行,一个输出偶数,一个输出奇数(方法二)
- [Java] DaemonThread(守护线程)简介---finally内的代码不一定会被执行