首页 > 试题广场 >

两个等价线程并发的执行下列程序,a为全局变量,初始为0,假设

[单选题]
两个等价线程并发的执行下列程序,a为全局变量,初始为0,假设printf、++、--操作都是原子性的,则输出不可能是()
 void foo() {
    if(a <= 0) {
        a++;
    }
    else {
        a--;
    }
    printf("%d", a);
}

  • 0 1
  • 1 0
  • 1 2
  • 2 2
并不是简单交换打印顺序就能实现0.1的,a是全局变量。如果先执行加操作,但并未打印,再在另一线程中执行减,最后的结果是0,再进行打印则两个打印的结果都是0
发表于 2017-10-15 12:20:27 回复(0)
关键点在于题中的:假设printf、++、--操作都是原子性的。
但实际上++和--不是原子操作,实际中A完全可能出现。
发表于 2018-04-04 00:17:05 回复(0)
如果进程2先入了if执行完后,进程1后执行,不就是0,1吗
发表于 2016-04-19 18:02:34 回复(6)
线程1先执行到第二行,线程2继续执行,线程2执行完a++,线程1继续执行a++,线程1输出2,线程2输出2
发表于 2015-08-30 11:01:00 回复(3)
我有一个疑问是,题目中一个线程对变量a的修改,对其他线程立即可解吗?题目描述不清楚。
发表于 2017-08-07 15:09:02 回复(1)
可以这样理解,要输出第一个要输出0的话,肯定是进行了一次++,一次--,既然已经执行了两次操作,说明后一个线程输出的值也已经无法改变了,必须也要输出0
发表于 2017-08-04 15:25:43 回复(0)
我觉得能出现1,0 就能出现0,1,printf就不能先后换一下执行顺序吗?
发表于 2017-04-12 10:33:53 回复(1)
还是不太明白
发表于 2016-02-28 21:38:18 回复(0)
炫头像
第一个线程执行后输出的结果不可能为0
发表于 2016-03-03 13:16:20 回复(2)
A    两个先输出 0,那么线程1,先执行,if完 a=1,线程2执行,if完,a=0,输出 0 ,然后线程1输出也是0,所以只可能是 0 0
发表于 2015-11-12 15:26:54 回复(0)
1.要使p1输出0,则在p1进入if后,执行了a++,a变为1;这时p2进入else,执行了a--,a变为0;所以,输出0,0,而不可能是0,1.
2.要使p1输出1,则在p1进入if后,执行了a++,a变为1并输出1;这时p2进入else,执行了a--,a变为0,输出0。
3.p1进行完if判断,进入if,接着p1进行完if判断,进入if;然后p1执行了a++,a变为1并输出1,p2执行了a++,a变为2,输出2。
4.p1进行完if判断,进入if,接着p1进行完if判断,进入if;然后p1执行了a++,a变为1,p2执行了a++,a变为2;最后p1输出2,p2输出2。
发表于 2015-07-07 11:03:05 回复(8)

假设++ --print属于原子操作,然后++ --并不是


发表于 2019-09-05 17:09:08 回复(0)
题目不严谨
发表于 2019-08-29 09:02:30 回复(0)
如果输出为0或2,说明两个线程都参与操作了,最后打印结果肯定是一样的
发表于 2019-05-09 17:57:10 回复(0)
假设printf、++、--操作都是原子性的,关键在这句话的理解上吧。++、--为原子性很好理解,就是++、--操作都是用内存中的值不用线程自身的工作内存中的值,但是printf操作为原子性的我没理解,按照答案来推,只能是printf打印的值也是内存的值才能的出答案为A。也就是说,三个操作都是针对内存来的。
发表于 2018-11-13 15:13:39 回复(0)
2出现的前提是两个线程已经进入了if语句,分清printf和自加执行的顺序即可区分C和D。
编辑于 2018-10-20 12:02:21 回复(0)
如果p1输入为1 i-- 为0 输出0 然后p2输入成了0,0++=1 输出为1    0 1啊有什么毛病
发表于 2018-08-18 14:09:30 回复(0)
理解了,如果第一次打印出0,那么就在该情况下,肯定是一个线程执行了+1,另一个线程执行了-1,操作。这也就是说,在这时候,a就已经没有别的操作改变数字的机会啦。最终只能输出 (0,0,而不是,(0,1)
发表于 2018-07-28 14:46:34 回复(0)
假设有线程A、B,因为是全局变量,且三个操作都是原子操作,保证了修改数据修改后能被其他线程获知。
1、线程A、B按顺序执行,输出1、0,但是输出先后不一定
2、线程A、B同时执行到if,输出1、2

发表于 2018-04-02 15:22:53 回复(0)
当第一个打印出来的是0,只有可能是读到了i--的值,就是说另一个线程也已经完成了运算,等待打印。因为已经做完--运算了,所以不可能打印出来的值还会比前边大
发表于 2018-03-22 17:04:41 回复(0)