ある家に引っ越してきたカップルを想像してみてください。
彼らは、家に荷降ろしする必要がある箱でいっぱいのトラックを持っています。
そこで、彼らは仕事を分割することにしました。
しばらくはうまく機能します。しかし、そこにピーターが現れ、兄のポールを助けることを申し出ます。突然、チャーリーが箱を拾う前に歩道が箱でいっぱいになります。彼はこれに腹を立て、コンラッドとカールの兄弟に電話をかけます。しかし、コンラッドは腕を負傷し、カールは携帯電話で遊んでいるので、今:
だから誰もがルールを作ります:そこに行く前に歩道をチェックしてください!
残念ながら、それは役に立ちませんでした。ポールとピーターがトラックの反対側を空にしてみると、どちらも歩道がほぼ満杯でしたが、明らかにもう 1 つの箱を入れるのに十分なスペースがありました。それで、彼らは両方とも箱を拾い上げ、歩き回り、お互いにぶつかりました(競合状態です!)。
最後にクインシー・キューが登場。彼は次の 3 つの新しいルールを作成します。
ポール/ピーター: 降りる前に、二人とも空いている場所があることを確認する必要があります:
コンラッド/カール/チャーリー: 受け取る前に箱があることを確認する必要があります:
そして最後に、私は 1 人しかいないため、複数の人が回線をいじっていると追跡できません。ステップ 1 または 2 で青信号を出したとしても、確認する必要があります。他に誰も電話に出ていないことを確認してください。
したがって、Peter/Paul の最終規則は次のようになります。
waitFor(spaceOnSideWalk)
waitFor(permissionToUseSideWalk))
dropBoxOnSidewalk(box)
nowSomeoneElseCanUse(permissionToUseSideWalk))
nowSomeoneElseCanUse(boxesOnSideWalk)
(およびチャーリー/カール/コンラッドの補足)
考えてみれば
waitFor == decrement == P
nowSomeoneElseCanUse == increment == V
次に、ウィキペディアのページに正確なアルゴリズムがあります。