Понимание критической области
Я читал в Интернете несколько примеров, касающихся критической области, протокола входа и выхода, и мне было трудно разобраться. 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;
}
}
Что такое протокол входа, протокол выхода и критическая область для этого примера? а что касается критического региона, это взаимное исключение, голод или это приведет к тупику?
1 ответ
Предположим, я кассир 1. Вы кассир 0.
lock[tellerID] = true;
Я беру замок для себя.
turn = 1 - tellerID;
Я говорю: "Теперь твоя очередь". Ход установлен на ID другого кассира (пока).
while
lock[1-tellerID]
Я делаю петлю, пока у тебя есть замок.
while
turn == (1 - tellerID)
Я также зацикливаюсь, пока твоя очередь.
Представьте, что мы оба достигли цикла while один за другим. У меня есть свой замок, а у вас есть ваш. Мы оба ждем, когда другой откроет замок или наша очередь. Это должна быть ваша очередь или моя очередь, поэтому только один из нас провалится. Это, очевидно, взаимное исключение. Когда вы отправитесь делать еще один депозит, вы уведомите меня, что теперь моя очередь.
Ожидание, взятие замков и по очереди являются частью протокола входа. Освобождение блокировок является частью протокола выхода. Все промежуточное по умолчанию является критическим разделом. Все, что снаружи, по умолчанию является некритическим разделом.