1

私はそれを試していますが、質問:ウィキでは、そのアルゴリズムの3番目のポイントは次のように述べています:

フォークを持った哲学者がリクエスト メッセージを受信すると、フォークが汚れていない場合はフォークを保持しますが、汚れている場合は放棄します。フォークを送る場合は、そうする前にフォークをきれいにします

これがデッドロックにつながらない理由を理解しようとしていますか? ある哲学者が 1 つのクリーンなフォークを持っていて、隣のダイナー/哲学者から別のクリーンなフォークを取得するのを待っている場合、その人も同様にフォークを待っている場合、これは累積してデッドロックになりますか? ある哲学者が常に他の哲学者からのフォークを待っている?

ps:私はスレッドと並行性に不慣れで、これを学習プロジェクトとして取り上げました。

編集:フォークが与えられる実際の場所、これを投稿して、フォークを変更可能にするかどうかを尋ねます。pLeft と pRight は左右の哲学者であり、fLeft と fRight は左右のフォークです。

private Fork giveFork(Philosopher diner) {
        Fork forkToGive;

        if (this.pLeft.equals(diner)) {
            // give left fork to left philosopher
            if (this.fLeft.isClean)
                forkToGive = null; // don't give
            else {
                forkToGive = new Fork(this.fLeft.id, true); // give the fork
            }

        } else if (diner.pRight.equals(this)) {
            // give right fork to right philosopher
            if (this.fRight.isClean)
                forkToGive = null;
            else {
                forkToGive = new Fork(this.fRight.id, true);
            }
        } else {
            // default value , i'm not yet sure if this code
            // can be theoretically reached
            forkToGive = null;
        }

        return forkToGive;

    }

同期する場所がわかりませんが、それでも同期が必要だと感じています。たとえば、2 人のダイナーが 1 人目と 3 人目が 2 人目の哲学者にフォークを頼んだとします。

4

1 に答える 1

5

あなたが引用した情報源はそれを説明しています:

ただし、システムが完全に対称な状態に初期化されている場合、すべての哲学者が左側のフォークを保持しているように、グラフは最初は循環的であり、それらのソリューションはデッドロックを防ぐことができません。より低い ID を持つ哲学者がダーティ フォークを持つようにシステムを初期化すると、グラフが最初は非循環的になります。

したがって、システムを非対称状態に初期化する必要があり、一連のルールは目的の状態 (非デッドロック状態) から離れないように設計されています。

于 2013-10-11T10:31:10.730 に答える