📜  门| GATE-CS-2006 |第 79 题

📅  最后修改于: 2021-09-26 04:23:54             🧑  作者: Mango

Barrier 是一种同步构造,其中一组进程全局同步,即该组中的每个进程到达屏障并等待所有其他进程到达,然后所有进程离开屏障。设集合中的进程数为 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 在所有进程之间共享并被初始化为零。在并发程序中,所有三个进程在需要全局同步时都会调用屏障函数。

以下哪一项纠正了实施中的问题?
(A)第 6 行到第 10 行简单地替换为 process_arrived–
(B)在屏障的开始,第一个进入屏障的进程等待
直到 process_arrived 变为零才继续执行 P(S)。
(C)上下文切换在屏障开始时被禁用,并在结束时重新启用。
(D)变量 process_left 被设为私有而不是共享答案:(乙)
解释:
当进程第二次进入屏障时,不应执行步骤“2”,直到其他两个进程还没有完成它们的第 7 步。这是为了防止变量 process_arrived 变得大于 3。所以,当变量process_arrived变为零,变量process_left也变为零时,死锁问题就解决了。因此,在屏障开始时,第一个进入屏障的进程会等待,直到 process_arrived 变为零,然后才能继续执行 P(S)。
因此,选项(B)是正确的。
如果您发现上面的帖子有任何错误,请在下面发表评论。这个问题的测验