Barrier 同步方法的实施不正确

Incorrect implementation of Barrier Method of synchronisation

考虑以下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);
 }

已知此代码因缺陷而无法运行,但我无法找到缺陷。

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

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

最初,process_arrived 和 process_left 将为“0”。
当进程到达时,它递增 process_arrived 并等待最大数量的进程到达。之后允许进程离开。

考虑以下场景:

P1 过来等待 process_arrived 变为 3(当前 process_arrived = 1)
P2 来等待 process_arrived 变为 3(当前 process_Arrived = 2)
现在 P3 来执行。 while循环中的条件失败,继续执行,使得process_left = 1,再次立即进入函数
它使 process_Arrived = 4 并在 while 循环中等待。
P2 有机会执行 make process_left = 2 并离开。
P1进一步执行,发现process_left = 3,从而使process_arrived和process_left都=0。(记住P3已经进入并在barrier处等待,所以这里有一个计数丢失)
P1 再次执行,使 process_arrived = 1 并等待。
P2 也再次执行。使 process_arrived = 2 并等待。

现在每个进程都将永远等待。因此发生了死锁。