该问题来自Stanford.的试卷,其描述如下:
假设两个线程同时执行以下C代码,访问共享变量a,b,和c:
初始化
int a = 4;
int b = 0;
int c = 0;
线程1:
if (a < 0) {
c = b - a;
} else {
c = b + a;
}
线程2:
b = 10;
a = -3
两个线程完成后c
的可能值是什么?您可以假设读取和变量的写入是原子的,每个线程内的语句顺序保留在C编译器生成的代码中。
答案:4,7,14,13,-3
我理解了下面的前四个输出,但是考虑到保留了线程内语句的顺序,我无法理解如何产生输出-3。
4:完全执行线程1,然后执行线程2。7:在c = b + a
之前中断线程1,然后执行线程2,然后再次执行线程1。14:执行线程2直到完成b = 10
,然后中断它,并完全执行线程1。13:完全执行线程2,然后执行线程1。
现在,我坚持如何获取-3作为c
的最终值? -3仅在b=0
和a=-3
以及线程1从c = b + a
开始执行时才可能。在其他任何情况下,我都看不到-3。但是正如所提到的,语句的顺序得以保持,因此a的值不能为-3,除非我们将b的值更改为10。
有人可以解释在这种情况下如何输出-3吗?
问题来自斯坦福大学的试卷。其描述如下:假设两个线程同时执行以下C代码,访问共享变量a,b和c:...
您可以如下获得-3
: