首页 > 试题广场 >

两个线程并发执行以下代码,假设a是全局变量,那么以下输出__

[不定项选择题]
两个线程并发执行以下代码,假设a是全局变量,那么以下输出___哪个是可能的?
int a=1;
void foo(){
    ++a;
    printf("%d", a);
}
  • 3 2
  • 2 3
  • 3 3
  • 2 2
推荐
答案是;ABCD
        假设线程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实际打印的是压栈的参数,是值拷贝的栈变量)
编辑于 2016-08-30 18:24:15 回复(12)
选项D是假设线程A先执行++a操作但没有写回到内存,这时线程B执行++a操作写回内存并printf,输出2_,线程A继续执行,++a操作写回内存,a的值保持2,再printf
发表于 2015-11-08 11:35:25 回复(5)
++a,printf不是原子操作,随时可能被抢占资源
发表于 2016-06-23 23:21:45 回复(0)
发表于 2016-09-09 15:16:54 回复(0)
++a和printf不是原子指令,可随时被打断;特别注意函数printf,a作为参数压栈后,a再变化则不会影响输出(printf实际打印的是压栈的参数,是值拷贝的栈变量)
发表于 2016-10-18 08:36:15 回复(0)
关于A答案
x和y线程
y先执行++a,a为2;  
y再执行printf,a入栈,在打印到终端之前切换到x  
x执行++a,a为3;  
x执行printf,输出3;再切换到y  
y执行打印,输出2  

这里关键有两点:  
(1)两个线程可随时被抢占  
(2)++a和printf不是原子指令,可随时被打断;特别注意函数printf,a作为参数压栈后,a再变化则不会影响输出(printf实际打印的是压栈的参数,是值拷贝的栈变量)

发表于 2016-03-26 11:35:24 回复(0)
++a和printf不是原子指令
发表于 2015-11-09 20:00:45 回复(0)
你的这个时间片不相等啊,y线程在打印到终端前时间片结束,x线程在打印到终端前时间片也结束了,所以还是y线程a=2先打印出来,然后再到x线程a=3打印。
发表于 2023-10-20 10:30:27 回复(0)
怎么解决这个问题啊各位大佬们。
发表于 2022-05-29 22:41:32 回复(0)
这个题不难,难的是这个题出在单选题之间,当我看到A对时选完A就下一个了555
发表于 2021-10-14 00:04:01 回复(0)
++a不是原子操作,分为两步,1:a+1 2:写回内存  
发表于 2018-03-06 21:05:12 回复(0)
关键有两点需要注意: (1)两个线程可随时被抢占 (2)++a和printf不是原子指令,可随时被打断;特别注意函数printf,a作为参数压栈后,a再变化则不会影响输出(printf实际打印的是压栈的参数,是值拷贝的栈变量)
发表于 2017-08-31 10:07:45 回复(0)
++a和printf不是原子指令,随时可以被打断。printf参数压栈后参数再改变不影响栈内的值
发表于 2017-03-18 15:56:21 回复(0)
同时读到a=1。同时写2
发表于 2016-07-19 09:35:55 回复(0)
这题关键在于各线程有自己的堆栈
发表于 2016-07-05 13:53:34 回复(1)