给定两个线程并行运行时,变量的可能值?

问题描述 投票:1回答:1

该问题来自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=0a=-3以及线程1从c = b + a开始执行时才可能。在其他任何情况下,我都看不到-3。但是正如所提到的,语句的顺序得以保持,因此a的值不能为-3,除非我们将b的值更改为10。

有人可以解释在这种情况下如何输出-3吗?

问题来自斯坦福大学的试卷。其描述如下:假设两个线程同时执行以下C代码,访问共享变量a,b和c:...

c multithreading concurrency operating-system
1个回答
1
投票

您可以如下获得-3

© www.soinside.com 2019 - 2024. All rights reserved.