3

ウィキペディアには、誰もが使用するサンプル コードがあります。

正直、P,Vの意味がわからない。

それは最初に言った

キューが空の場合、消費者はプロデューサーが何かを生成するのを待つ必要があります。

しかし、それは言った

例。1 つのコンシューマがクリティカル セクションに入ります。fullCount が 0 であるため、コンシューマはブロックします。

ブロッキングは待つことを意味すると思いますか?私の宿題では、このようなバイナリ セマフォの使用法を理解し、別の種類の生産者と消費者の問題の解決策を実装する必要があります。しかし、いつインクリメントするか (どの共有変数を P と V に設定するか) またはデクリメントするかがわかりません。それで、詳しい人が私に説明してくれることを願っていますか?よろしければ、CS 以外の学生のように扱っていただけますか?

4

2 に答える 2

3

ある家に引っ越してきたカップルを想像してみてください。

彼らは、家に荷降ろしする必要がある箱でいっぱいのトラックを持っています。

そこで、彼らは仕事を分割することにしました。

  • ポール・プロデューサーは、トラックから箱を降ろして歩道に並べると言っています。

  • チャーリー・コンシューマーは、箱を歩道から外して家に持ち込むと言います.

しばらくはうまく機能します。しかし、そこにピーターが現れ、兄のポールを助けることを申し出ます。突然、チャーリーが箱を拾う前に歩道が箱でいっぱいになります。彼はこれに腹を立て、コンラッドとカールの兄弟に電話をかけます。しかし、コンラッドは腕を負傷し、カールは携帯電話で遊んでいるので、今:

  • 時々、生産者 (ポール、ピーター) はまだ消費者を追い越しています。

  • 消費者 (チャーリー、コンラッド、カール) が生産者を追い越して、家で荷解きをせずに歩道に立っていることがあります。

だから誰もがルールを作ります:そこに行く前に歩道をチェックしてください!

残念ながら、それは役に立ちませんでした。ポールとピーターがトラックの反対側を空にしてみると、どちらも歩道がほぼ満杯でしたが、明らかにもう 1 つの箱を入れるのに十分なスペースがありました。それで、彼らは両方とも箱を拾い上げ、歩き回り、お互いにぶつかりました(競合状態です!)。

最後にクインシー・キューが登場。彼は次の 3 つの新しいルールを作成します。

  1. ポール/ピーター: 降りる前に、二人とも空いている場所があることを確認する必要があります:

  2. コンラッド/カール/チャーリー: 受け取る前に箱があることを確認する必要があります:

  3. そして最後に、私は 1 人しかいないため、複数の人が回線をいじっていると追跡できません。ステップ 1 または 2 で青信号を出したとしても、確認する必要があります。他に誰も電話に出ていないことを確認してください。

したがって、Peter/Paul の最終規則は次のようになります。

waitFor(spaceOnSideWalk)
waitFor(permissionToUseSideWalk))
dropBoxOnSidewalk(box)
nowSomeoneElseCanUse(permissionToUseSideWalk))
nowSomeoneElseCanUse(boxesOnSideWalk)

(およびチャーリー/カール/コンラッドの補足)

考えてみれば

waitFor == decrement == P
nowSomeoneElseCanUse == increment == V

次に、ウィキペディアのページに正確なアルゴリズムがあります。

于 2012-11-14T07:52:26.083 に答える
1

fullCount セマフォが 0 で、コンシューマが P(fullCount) を実行すると、プロデューサが V(fullCount) を実行してセマフォを増やすまでブロック (待機) します。

P(useQueue) は、コンシューマーとプロデューサーの両方が、キューを変更する排他的な権利を持っていることを確認するために使用されます。変更を行った後、V(useQueue) を実行してキューを再び解放します。

これで質問に答えられない場合は、質問をより明確にする必要があると思います。

于 2012-11-14T07:24:23.550 に答える