Operating system 在两个并发进程完成执行后,它们的共享变量的最小值和最大值是多少?

Operating system 在两个并发进程完成执行后,它们的共享变量的最小值和最大值是多少?,operating-system,synchronization,critical-section,Operating System,Synchronization,Critical Section,进程P1和P2同时执行。它们都有一个私有变量i,并且都使用共享变量count,该变量被初始化为零 线程T1: for i = 0 to 10 { count = count + 1 } 螺纹T2: for i = 0 to 10 { count = count - 1 } 在两个都完成执行后,变量count的最小值和最大值是多少 我试图解决这个问题:它们都在访问共享内存,因此根据竞争条件,谁先完成,谁就拥有最终值。假设T1每次都首先完成,count的最大值为10。假设T2每次

进程P1和P2同时执行。它们都有一个私有变量i,并且都使用共享变量count,该变量被初始化为零

线程T1:

for i = 0 to 10 {
    count = count + 1
}
螺纹T2:

for i = 0 to 10 {
    count = count - 1
}
在两个都完成执行后,变量count的最小值和最大值是多少


我试图解决这个问题:它们都在访问共享内存,因此根据竞争条件,谁先完成,谁就拥有最终值。假设T1每次都首先完成,count的最大值为10。假设T2每次都首先完成,count的最小值为-10。这是否正确?

我认为+10和-10结果假设只有一个线程对该值进行操作,因此,当您说“T1每次都首先完成”时,您假设T2从未执行。我认为这不是一个合理的假设。我希望
count=count+1
count=count-1
操作都要执行10次


假设
count=count+1
(或
-1
)操作是原子操作,这个问题似乎与询问“10+1和10-1的任何排列的最小和最大和是什么?”相同,即,。T1和T2操作可以以任何组合交错。在我看来,在所有情况下,最终结果似乎都是0,但由于这看起来非常像一个家庭作业,我将把它留给你去解决。

不,我假设两者都执行了,但由于比赛条件的原因,只有先完成的一个才会写入countOk的最终值。我的“假设操作是原子的”部分旨在排除竞争条件。如果您想将竞争条件作为一个因素,我们需要有关上下文的更多信息。不仅可以交错执行
=
操作(因此一个操作覆盖另一个操作),而且取决于
+
计数的数据类型。而
-
操作可能是交错的(例如,你+一个值的“单词”和-另一个),更一般地说,我认为抽象的答案是:1。分配给
count
2的任务。
count
3的值的“读取”。你可以假设+1或-1操作是原子操作,想象一下你可以将这些步骤混合在一起的所有方式。我找到了答案。正确答案是-10和10。如果在任何时候负载计数和存储计数之间有一个中断,那么另一个线程将获得CPU并运行到完成。然后原始线程获得CPU,它拥有的最后一个值仍然在寄存器中,因此它覆盖了其他线程所做的任何事情。