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 并等待。
现在每个进程都将永远等待。因此发生了死锁。
考虑以下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 并等待。
现在每个进程都将永远等待。因此发生了死锁。