流程0
do{
flag[0] = TRUE;
turn = 1;
while (flag[1] && turn == 1);
critical section
flag[0] = FALSE;
remainder
}while(1)
流程1
do{
flag[1] = TRUE;
turn = 0;
while (flag[0] && turn == 0);
critical section
flag[1] = FALSE;
remainder
}while(1)
flag[]
和turn
是共享变量的位置。
假设进程0首先开始执行,并在while
停止循环。然后,进程1在while
处继续前进和停止。然后进程0继续执行,同时条件中断并执行其临界区。精细。我的问题是如何保证有限的等待?在这种情况下,我似乎无法解决这个问题:
进程0退出临界区集flag[0] = FALSE;
,但是进程1没有恢复执行而是进程0重新开始,设置flag[0] = TRUE;
并重新输入关键区段代码。我错过了什么?
答案 0 :(得分:1)
进程0退出临界区集flag [0] = FALSE;但是之后 进程1没有恢复执行而是进程0从头开始 再次,设置标志[0] = TRUE;
是的,你是对的,但是当进程0重新开始并尝试重新进入关键部分时,它将再次执行以下两个语句:
flag[0] = TRUE;
turn = 1;
所以转将 1 ,因为我们知道进程1尚未进入关键部分,因为标志[1] 是仍然 true 因此循环条件
while (flag[1] && turn == 1);
将 true ,这意味着进程0将无法两次进入临界区。这满足有界等待的条件。此外,只要进程1将恢复执行条件
while (flag[0] && turn == 0);
将变为假,因为转为1 ,它确实会进入关键部分。