0

这两个线程在共享内存中同时运行(所有变量在两个线程之间共享):
线程 A

for (i=0; i<5; i++) {
  x = x + 1;
}

线程 B

for (j=0; j<5; j++) {
   x = x + 2;
}

假设一个单处理器系统
a- 给出一个简明的证明为什么当两个线程都完成时 x≤15。
b- 假设我们将线程 B 中的 x = x+2 替换为 x = x-1,那么 X 的值是多少。

我不明白这个问题,我用谷歌搜索它并找到了答案,但我无法得到它我想要一些解释。

4

2 回答 2

4

如果线程工作完美,'x' 可以有的最大值是 15。这完全取决于操作系统的调度程序。

请注意,我假设 x 的初始值为 0!假设线程 A 和线程 B 是序列化的。线程 A 完成后 x 的值为 5。

 i | x
-------
 0 | 1
 1 | 2
 2 | 3
 3 | 4
 4 | 5

进入线程 B 的 x 的值为 5,导致 x 的最终值为 15

 i | x
-------
 0 | 7
 1 | 9
 2 | 11
 3 | 13
 4 | 15

现在,事情通常不会以这种方式发生,一个线程将读取 x 的初始值并进行加法,然后将修改后的值写回内存。可能会发生以下情况。

Thread A reads the value 'x' as 0
Thread B reads the value 'x' as 0
Thread A adds 1 to x making its local copy of x, 1
Thread B adds 2 to x making its local copy of x, 2
Thread A writes its modified value of x as 1
Thread B writes its modified value of x as 2 (overwriting Thread A's modification)

因此,x 不会超过 15,但取决于调度程序,会更少!

于 2012-11-12T17:27:20.240 回答
2

a) 指令x=x+1在低级不是单条指令,它由读取 x 的序列组成,然后将 x 加 1,然后更新 x 的内存。因此,可能会发生两个线程读取相同的 x 值。

假设,如果两个线程读取 x 变量的相同值,则更新 x 并写回 x,这导致 x < 15。

b) 出于同样的原因,如果您的指令是 ,则 x 的值可能介于 0 到 5 之间x=x-1


试试这个你会学到更多!
用它编译你的c代码-S option将为你的程序创建一个编译的汇编代码。然后就可以了understand x = x + 1 is not a single instruction。并且在指令完成之前可以在线程之间切换,x = x + 1 因此它不是原子的。

于 2012-11-12T17:43:12.300 回答