我对彼得森的算法有点困难: 算法说:
flag[i] = true;
turn = j;
while (flag[j] && turn == j);
// critical section
...
// end of critical section
flag[i] = false;
现在让我们假设一下 标志[0] =标志[1] =真
如果P1开始执行,它将忙于等待while循环,因为flag [0]和turn == 0都将为真。现在,如果P0不想执行,P1将永远不会执行临界区。
请明白我的疑问;我的理解可能存在差距。
由于
答案 0 :(得分:1)
现在假设最初标志[0] =标志[1] =真
现在如果P0不想执行,P1将永远不会执行临界区。
两个标志都应初始化为false
。两者都可以设置为true
的唯一方法是,如果两个进程都想要执行或正在执行临界区。因此,如果P1正在等待执行,flag[0]
为true
,那么P0必须要么执行临界区,要么在执行它之前,之后将设置flag[0]
到false
,P1可以进入临界区。此外,如果P1正在等待执行,则P0也不能等待执行,因为等待条件是互斥的(因为turn
是0或1并且不能同时执行)。
初始化true
的两个标志可能会导致您描述的死锁。这样做是没有意义的,因为标志的含义是指示进程想要进入临界区,所以如果不是这样,为什么要设置该值?