如果我们有两个具有共享变量 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,它将有一个未更新的值,这将导致竞争条件,并且该变量将具有 -5 和 + 之间的任何值正如您所指出的,两个线程完成执行后,如图 5 所示,这取决于两个线程可以具有的不同执行顺序。
关于race-condition - 共享变量 x 的可能结果值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19254229/