单处理器系统中的线程

时间:2012-11-12 17:18:36

标签: multithreading operating-system

这两个线程在共享内存中并发运行(所有变量都是 在两个线程之间共享):
主题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的值。

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

2 个答案:

答案 0 :(得分: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,但取决于调度程序,将会更少!

答案 1 :(得分:2)

<强> A) 指令x=x+1不是低级别的单指令,它由读取x的序列组成,然后将x加1,然后更新x的存储器。因此,可能发生两个线程读取相同的x值。

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

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


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