我试图了解彼得森的同步解决方案。作为参考,我附上了阅读的来源:
这是来自维基百科页面。现在,
让我们说P1想要进入关键部分。它设置了flag1 = true
和turn=0
。如果P0已经在其临界区中,P1将在其while循环 while(flag[0] == true && turn ==0)
中连续等待flag[0] = true
。
我怀疑是:
flag[0] = true
行。由于某种原因,它无法执行下一行并终止。在这里,flag [0]也是如此
转弯也是0. P1在没有进程的情况下不必要地等待
关键部分。 turn
变量。为什么不只是这样: while(flag[0]== true)
只要P0会
离开临界区,flag [0] = false,P1就可以了
输入我对此同步问题感到困惑,任何帮助都将不胜感激。
答案 0 :(得分:1)
- 为什么需要检查转弯变量。为什么不只是这样:while(flag [0] == true)一旦P0离开临界区,标志[0] =假,P1就能进入
醇>
如果你只使用flag [0]和flag [1],它将导致死锁。让我们考虑P0设置标志[0] =真并继续检查while循环中的条件。在P0可以将标志[1]值加载到寄存器中进行比较之前,P1设置标志[1] =真。所以现在P0加载值为true并且将继续等待,因为标志[0]也是真的并且P0卡在while循环中,P1也会等待while循环。这是一个死锁条件,因为它们都在等待另一个将标志值更改为false。
- 在这种情况下会发生什么:P1正在执行其while循环,当P0尝试进入临界区并执行行标志[0] = true时。由于某种原因,它无法执行下一行并终止。在这里,flag [0]也是true,turn也是0.P1不必等待,而临界区内没有进程。
醇>
对于这个问题,我不认为P0突然终止证明了Peterson的同步解决方案的实施是错误的。它是程序中的缺陷,任何错误的代码都可能导致这种死锁情况。
答案 1 :(得分:0)
http://www2.cs.uregina.ca/~hamilton/courses/330/notes/synchro/node3.html
以下链接通过说明3个案例解释了为什么我们需要Peterson解决方案的转弯变量。基本上,如果没有使用转弯变量,则会导致死锁。