0

本「マルチスレッド、並列、および分散プログラミングの基礎」の演習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 の位置に書くことができ、一部の読者は古いメッセージを読まないでしょう。

4

0 に答える 0