某个计算会生成两个数组a,b这样
a[i]=f(i) for 0 ≤ i < n and b[i] = g(a[i]) for 0 ≤ i < n。假设这个计算被分解成两个并发进程,X计算数组并计算数组。这些过程使用两个二进制信号量和,都初始化为零。该数组由两个进程共享。进程的结构如下所示。YXaYbRSa
Process X:
private i;
for (i=0; i < n; i++) {
a[i] = f(i);
ExitX(R, S);
}
Process Y:
private i;
for (i=0; i < n; i++) {
EntryY(R, S);
b[i]=g(a[i]);
}
以下哪一项代表 和 的正确ExitX实现EntryY?
(一个)
ExitX(R, S) {
P(R);
V(S);
}
EntryY (R, S) {
P(S);
V(R);
}
(乙)
ExitX(R, S) {
V(R);
V(S);
}
EntryY(R, S) {
P(R);
P(S);
}
(C)
ExitX(R, S) {
P(S);
V(R);
}
EntryY(R, S) {
V(S);
P(R);
}
(四)
ExitX(R, S) {
V(R);
P(S);
}
EntryY(R, S) {
V(S);
P(R);
}
我相信答案应该是(B),因为在Y执行关键部分之前不应该执行进程中的关键部分X(a[i]首先填充,必须用于b[i]),所以之后X执行然后根据选项(B)在Y我们会发现临界区的入口R=1,S=1所以现在临界区Y就可以执行了。
问题:正确答案是(C),我错在哪里?