本「マルチスレッド、並列、および分散プログラミングの基礎」の演習5.10を解決しようとしています。
エクササイズは
「1 つのプロデューサー プロセスと N 個のコンシューマー プロセスが、B スロットを持つ制限付きバッファーを共有すると仮定します。プロデューサーはメッセージをバッファーに格納し、コンシューマーはそれらをフェッチします。プロデューサーによって格納されたすべてのメッセージは、N 個すべてのコンシューマーによって受信されます。さらに、各コンシューマーは預け入れられた順序でメッセージを受け取る. ただし, コンシューマは異なる時間にメッセージを受け取ることができる. 例えば, あるコンシューマは別のコンシューマよりも最大 B 回多くのメッセージを受け取ることができる. 2 番目のコンシューマが遅い場合. この種の通信を実装するモニターを開発する. . シグナル アンド コンティニューの規律を使用してください。」
誰か助けてくれませんか?
どうもありがとうございました!
- 編集:
私は今、私がすでに作ったものにコメントしています(私がすべてを書いた場合、質問は非常に大きいと思ったからです)。
/* creating a buffer of B positions. */
global buffer[B];
Monitor {
cond ok_write;
cond ok_read;
int stamp_buffer[B] = [0, 0, .., 0]
request_write (int pos){
if (stamp_buffer[pos] > 0)
wait(ok_write);
write_message (buufer[pos]);
stamp_buffer[pos] = N;
signalAll (ok_read);
}
request_read (int pos){
if (stamp_buffer[pos] == 0)
wait (ok_read);
stamp_buffer[pos] --;
}
release_read (int pos){
if (stamp_buffer[pos]==0)
signal(ok_write);
}
}
ですから、「読者は同じメッセージを 2 回読むことができる」という問題がまだ残っていると思います。
私のアルゴリズムの基本的なアイデアは次のとおりです。ライターは位置「pos」に書き込み、stamp[pos] の値を N に設定します。次に、各リーダーが位置 pos を読み取ると、stamp[pos] - 1 を実行します。したがって、 stamp[pos] がゼロの場合、メッセージ buffer[pos] はすでに N 回読み取られており、ライターはこの位置に再度書き込むことができます。
しかし、ある読者がメッセージを 2 回 (またはそれ以上) 読んだ場合、ライターは新しいメッセージを pos の位置に書くことができ、一部の読者は古いメッセージを読まないでしょう。