Operating system 在彼得森有界的等待';s溶液

Operating system 在彼得森有界的等待';s溶液,operating-system,synchronization,system,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;

考虑两个过程:

进程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首先开始执行,并在时停止循环。然后进程1运行并在
处停止,而
。然后进程0继续执行,而条件中断并执行其关键部分。好的<我的问题是如何保证有界等待?在这种情况下,我似乎无法解决:
进程0退出临界段集
标志[0]=FALSE但进程1不会继续执行,而进程0会重新启动,设置
标志[0]=TRUE并可以重新输入关键部分代码。我错过了什么

进程0退出临界段集合标志[0]=FALSE;但是 进程1不会继续执行,而进程0会从头开始 再次设置标志[0]=TRUE

是的,直到这里您仍然正确,但当进程0重新启动并尝试重新进入临界区时,它将再次执行以下两条语句:

flag[0] = TRUE;
turn = 1;
因此turn将为1,正如我们所知,过程1尚未进入关键部分,因此标志[1]仍然为,因此循环条件为

 while (flag[1] && turn == 1);
while (flag[0] && turn == 0);
为true这意味着进程0将无法两次进入临界区。这满足了有界等待的条件。每当进程1恢复执行时,该条件也将被取消

 while (flag[1] && turn == 1);
while (flag[0] && turn == 0);
当回合数为1时,将变为假,并且它确实将进入临界区