Operating system 同步屏障方法的错误实施

Operating system 同步屏障方法的错误实施,operating-system,synchronization,barrier,Operating System,Synchronization,Barrier,考虑以下屏障方法来实现同步: void barrier { P(s); process_arrived++; V(s); while(process_arrived != 3); P(s); process_left++; if(process_left == 3) { process_Arrived = 0; process_left = 0; } V(s)

考虑以下屏障方法来实现同步:

void barrier 
{
     P(s);
     process_arrived++;
     V(s);
     while(process_arrived != 3);
     P(s);
     process_left++;
     if(process_left == 3)
     {
        process_Arrived = 0;
        process_left = 0; 
      }
     V(s);
 }

已知此代码因缺陷而无法工作,但我无法找到该缺陷。

问题在于条件:if(process_left==3)

如果立即连续使用两个屏障调用,可能会导致死锁

最初,进程_到达,进程_离开将为“0”。
当一个进程到达时,它会增加到达的进程数量,并等待最大数量的进程到达。在那之后,进程被允许离开。

考虑以下场景:

P1出现并等待进程_到达变为3(当前进程_到达=1)
P2出现并等待进程_到达变为3(当前进程_到达=2)
现在P3来执行。while循环中的条件失败并进一步执行,使进程_left=1并立即再次进入该函数。
它使进程_到达=4并在while循环中等待。
P2有机会执行make进程_left=2并离开。
P1进一步执行并发现进程_left=3,从而使进程_到达,进程_left=0。(请记住,P3已经进入并在障碍物处等待,因此这里的计数丢失)
P1再次执行,使进程_到达=1并等待。
P2也再次执行。使进程_到达=2并等待。

现在,每个过程都将永远等待。因此出现了僵局