了解关键区域



我在网上读了一些关于关键区域、进入协议和退出协议的例子,很难弄清楚。http://pages.cs.wisc.edu/~dusseau/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;
}
}

这个例子的入口协议、出口协议和关键区域是什么?至于关键地区,这是相互排斥、饥饿还是会导致僵局?

假设我是出纳员1。您是出纳员0。

lock[tellerID] = true;

我给自己拿了把锁。

turn = 1 - tellerID;

我说"现在轮到你了。"turn设置为另一个出纳员的ID(目前)。

whilelock[1-tellerID]

当你有锁时,我循环

whileturn == (1 - tellerID)

当轮到你时,我也循环

想象一下,我们都相继到达while循环。我有我的锁,你也有你的锁。我们都在等待对方解除锁定,或者轮到我们。要么轮到你,要么轮到我,所以我们中只有一个人会失败。这显然是相互排斥。当你再存款时,你会通知我该轮到我了。

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

最新更新