屏障是一种同步结构,其中一组进程全局同步,即集合中的每个进程到达屏障并等待所有其他进程到达,然后所有进程离开屏障。令集合中的进程数为 3,S 为具有常用 P 和 V 函数的二进制信号量。考虑以下 C 实现的屏障,其中行号显示在左侧。
void barrier (void) {
1: P(S);
2: process_arrived++;
3: V(S);
4: while (process_arrived !=3);
5: P(S);
6: process_left++;
7: if (process_left==3)
{
8: process_arrived = 0;
9: process_left = 0;
10: }
11: V(S);
}
变量 process_arrived 和 process_left 在所有进程之间共享并初始化为零。在并发程序中,所有三个进程在需要全局同步时都会调用屏障函数。
上述实施会奏效吗?我认为如果立即连续使用两个屏障调用可能会导致死锁,因为进入屏障的第一个进程不会等到 process_arrived 变为零才继续执行 P(S)。