この問題を想定します: 2 つのプログラム、A と B、A の 1 つのプロセス、M の M プロセス、var という名前の 1 つの共有変数
A
main(){
int i, a[50];
for(i=0;i<50;i++)
var = a[i];
}
B
main(){
int i, b[50];
for(i=0;i<50;i++)
b[i] = var;
}
ここで、A のループごとに、M 個の B プロセスのそれぞれが共有変数を (1 回だけ!) 読み取り、それを配列に格納するようにする必要があります。したがって、最終的に各 B プロセスは、b 配列に a 配列のコピーを持ちます。これはセマフォの問題であり、解決策は疑似コードである可能性があるため、言語は関係ありません。
機能しない初期ソリューション: 0 で初期化されたセマフォ B を使用しています。A が何かを書き込むたびに、B を M ずつ増やして、down(A) を実行しています。各 B ループの開始時に、down(B) を実行します。次に、B の各ループの最後で、M 人のリーダーが var を読み込んで格納したかどうかを確認し、そうであれば、up(A) を実行しています。
明らかに、上記により、単一の B プロセスが、M リーダーを介して分散されるはずだったすべての M の使用を「消費」することができます。では、どうすれば (賢く)、各 B が各 var を 1 回だけ読み取るようにすることができるでしょうか? M ごとに 1 つずつ、M セマフォの配列が機能しますが、演習で求められているものではない可能性が高くなります。