2

如果我们有两个具有共享变量 x 的不同进程,当两个进程都完成时 x 的可能值是多少?

进程 A 正在运行以下 for 循环:

for (i = 0; i < 5; i++)
    x++

进程 B 正在运行:

for (j = 0; j < 5; j++)
    x--

我想说 x 可以是 -5 到 5 之间的任何值,假设 x 被初始化为 0。这是真的吗?请附上解释。

4

2 回答 2

1

假设编译器将生成一条将递增x++或递减的指令,x--它将具有与在两个线程完成后执行 for 循环之前相同的值,即 0。

否则,让我们看下面的例子:

x++:
1. MOV R1, x     //register R1 receives x
2. INC R1        //register R1 is incremented
3. MOV x, R1     //store decremented x back to the memory

x--:
1. MOV R1, x     //register R1 receives x
2. DEC R1        //register R1 is decremented
3. MOV x, R1     //store decremented x back to the memory

现在很明显,如果一个线程在执行第 1 行后失去 CPU,它将有一个未更新的值,这将导致竞争条件,然后该变量将在两者之后具有任何值 beetwen -5 和 +5正如您所指出的,线程完成了它们的执行,这取决于两个线程可以具有的不同执行顺序。

于 2013-10-08T17:24:45.267 回答
1

你是对的。想象一下这个场景:

进程 A 和进程 B(为了清楚起见我们称它们为线程)都进入循环的第一次迭代。两个线程都检索x(0) 的值,保留该值的本地副本,计算它们的增量/减量,然后相互竞争以更新包含x. 假设A首先存储,B存储第二。的结果值x现在是 -1。

再重复四次,x结果为-5

反转上面的比赛,x结果为5

于 2013-10-08T17:36:31.887 回答