在彼得森的解决方案中等待着

时间:2018-06-09 09:45:57

标签: operating-system synchronization system

流程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;并重新输入关键区段代码。我错过了什么?

1 个答案:

答案 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 ,它确实会进入关键部分。