这两个线程在共享内存中并发运行(所有变量都是
在两个线程之间共享):
主题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的值。
我不明白这个问题,我谷歌它,我找到答案但我无法得到它 我想要一些解释。
答案 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
指令之前切换线程是可能的,因此它不是原子的。