ある計算では、とb
の2つの配列
a[i]=f(i) for 0 ≤ i < n and b[i] = g(a[i]) for 0 ≤ i < n
が生成されます。この計算がX
とY
の2つの並列プロセスに分解され、X
が配列a
を計算し、Y
が配列b
を計算すると仮定します。このプロセスは、2つのバイナリセマフォーR
とS
を使用します。どちらも0に初期化されます。配列a
は、2つのプロセスで共有されます。プロセスの構造を以下に示す。以下のいずれかがExitX
とEntryY
の正しい実装を表しコード内のバイナリセマフォの使用
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]);
}
?
(A)
ExitX(R, S) {
P(R);
V(S);
}
EntryY (R, S) {
P(S);
V(R);
}
(B)
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);
}
(D)
ExitX(R, S) {
V(R);
P(S);
}
EntryY(R, S) {
V(S);
P(R);
}
私はプロセスY
でクリティカルセクションがX
でクリティカルセクションが実行されるまで(a[i]
が最初に満たされ、b[i]
に使用する必要があります)を実行すべきではない、そうX
後、次に実行されるための答えは(B)あるべきと考えています(B)によると、Y
のクリティカルセクションのエントリでは、S=1
となるので、今度はY
のクリティカルセクションを実行できます。
質問:正解は(C)ですが、どこが間違っていますか?
Bは2つのロックを崩壊させ、正しいものではありません。ここでのポイントは、2つのループを調整することです。私はそれを書き留めてみましょう。 – HuStmpHrrr