某个计算会生成两个数组a
,b
这样
a[i]=f(i) for 0 ≤ i < n and b[i] = g(a[i]) for 0 ≤ i < n
。假设这个计算被分解成两个并发进程,X
计算数组并计算数组。这些过程使用两个二进制信号量和,都初始化为零。该数组由两个进程共享。进程的结构如下所示。Y
X
a
Y
b
R
S
a
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),我错在哪里?