屏障是一种同步构造,其中一组进程进行全局同步,即,该组中的每个进程都到达屏障,并等待所有其他进程到达,然后所有进程都离开屏障。令集合中的进程数为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在所有进程之间共享,并初始化为零。在并发程序中,这三个进程在需要全局同步时都会调用barrier函数。
以下哪一项纠正了实施中的问题?
(A)第6至10行仅由process_arrived取代–
(B)在屏障开始时,进入屏障的第一个过程等待
直到process_arrived变为零,然后再继续执行P(S)。
(C)在障碍开始时禁用上下文切换,并在结束时重新启用上下文切换。
(D)将变量process_left设为私有,而不是共享答案: (B)
解释:
当过程第二次进入屏障时,不应执行步骤“ 2”,直到其他两个过程尚未完成其第七步。这是为了防止变量process_arrived大于3。因此,当变量process_arrived变为零且变量process_left也变为零时,死锁问题将得到解决。因此,在障碍的开始处,进入障碍的第一个进程将等到process_arrived变为零,然后再继续执行P(S)。
因此,选项(B)是正确的。
如果您在以上文章中发现任何错误,请在下面发表评论。这个问题的测验