-1

クリティカル リージョン、エントリ プロトコル、およびエグジット プロトコルに関するいくつかの例をオンラインで読んでいましたが、理解するのに苦労しました。 http://pages.cs.wisc.edu/~dusseau/Classes/CS537-S01/SampleQuizzes/sol2.html

class BankAccount {

    private int turn = 0;
    private boolean lock = {true, true};
    private int balance;
    private int accountNumber;

    BankAccount(int acct) {
        accountNumber = acct;
        balance = 0;
    }

   // tellerID is either 0 or 1
   public void deposit(int amount, int tellerID) {
        lock[tellerID] = true;
        turn = 1 - tellerID;
        while (lock[1-tellerID] && turn == (1 - tellerID));
        balance += amount;
        lock[tellerID] = false;
    }
}

この例の入口プロトコル、出口プロトコル、および重要な領域は何ですか? 臨界領域については、相互排除、飢餓、またはデッドロックになりますか?

4

1 に答える 1

1

私が出納係 1 だとします。あなたは出納係 0 です。

lock[tellerID] = true;

私は自分のためにロックをつかみます。

turn = 1 - tellerID;

「今度はあなたの番です」と言います。順番は(今のところ)他の窓口のIDに設定されています。

while lock[1-tellerID]

あなたがロックしている間、私はループします。

while turn == (1 - tellerID)

あなたの番の間、私もループします

2 人とも while ループに次々と到達したと想像してください。私は私の鍵を持っています、そしてあなたはあなたの鍵を持っています。私たちは、相手がロックを解除するか、自分の番になるのを待っています。あなたの番か私の番のどちらかでなければならないので、私たちのうちの 1 人だけがループを抜けます。これは明らかに相互排除です。あなたが別の預金をしに行くとき、あなたは私の番であることを私に通知します。

待機、ロックの取得、順番の取得はすべて、エントリ プロトコルの一部です。ロックの解放は、終了プロトコルの一部です。デフォルトでは、その間のすべてがクリティカル セクションです。外側のすべては、デフォルトでは非クリティカル セクションです。

于 2014-02-27T15:50:02.163 に答える