-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;

我说“现在轮到你了。 ” Turn 设置为其他柜员的 ID(暂时)。

while lock[1-tellerID]

在你有锁的时候循环

while turn == (1 - tellerID)

轮到你的时候我也循环。

想象一下,我们都一个接一个地到达了while循环。我有我的锁,你有你的锁。我们都在等待对方释放锁,或者轮到我们。必须轮到你或轮到我,所以只有我们中的一个人会掉入循环中。这显然是相互排斥的。当你去进行另一笔存款时,你会通知我轮到我了。

等待、抢锁和轮流都是进入协议的一部分。释放锁是退出协议的一部分。默认情况下,介于两者之间的所有内容都是临界区。默认情况下,外部的所有内容都是非关键部分

于 2014-02-27T15:50:02.163 回答