如果我们有两个具有共享变量 x 的不同进程,当两个进程都完成时 x 的可能值是多少?
进程 A 正在运行以下 for 循环:
for (i = 0; i < 5; i++)
x++
进程 B 正在运行:
for (j = 0; j < 5; j++)
x--
我想说 x 可以是 -5 到 5 之间的任何值,假设 x 被初始化为 0。这是真的吗?请附上解释。
如果我们有两个具有共享变量 x 的不同进程,当两个进程都完成时 x 的可能值是多少?
进程 A 正在运行以下 for 循环:
for (i = 0; i < 5; i++)
x++
进程 B 正在运行:
for (j = 0; j < 5; j++)
x--
我想说 x 可以是 -5 到 5 之间的任何值,假设 x 被初始化为 0。这是真的吗?请附上解释。
假设编译器将生成一条将递增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正如您所指出的,线程完成了它们的执行,这取决于两个线程可以具有的不同执行顺序。
你是对的。想象一下这个场景:
进程 A 和进程 B(为了清楚起见我们称它们为线程)都进入循环的第一次迭代。两个线程都检索x
(0) 的值,保留该值的本地副本,计算它们的增量/减量,然后相互竞争以更新包含x
. 假设A首先存储,B存储第二。的结果值x
现在是 -1。
再重复四次,x
结果为-5
。
反转上面的比赛,x
结果为5
。