我正在网上阅读关于关键区域,入口协议和退出协议的一些例子,并且很难搞清楚。 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;
}
}
此示例的入口协议,退出协议和关键区域是什么? 至于关键区域,它是相互排斥,饥饿还是会导致僵局?
答案 0 :(得分:1)
假设我是出纳员1.你是出纳员。
lock[tellerID] = true;
我为自己抓住了锁。
turn = 1 - tellerID;
我说“现在轮到你了。”将转弯设置为其他出纳员的ID(暂时)。
while
lock[1-tellerID]
我锁定时循环。
while
turn == (1 - tellerID)
轮到你时循环。
想象一下,我们一个接一个地到达了while循环。我有锁,你有锁。我们都在等待对方释放锁定,或者轮到我们。它必须轮到您轮到我,所以我们中只有一个人会经历这个循环。这显然是互斥。当你再去存款时,你会通知我轮到我了。
等待,抓住锁定和轮流都是条目协议的一部分。释放锁是退出协议的一部分。默认情况下,介于两者之间的所有内容都是关键部分。默认情况下,外面的所有内容都是非关键部分。