Page 85 - 6571
P. 85
TS. Опишемо способи подальшого усунення конфліктів звернен-
ня до пам’яті.
У лістингу 6 представлено повне рішення задачі критичної
секції, що використовує вхідний протокол «перевірити-
перевірити-встановити». Як і раніше, протокол виходу скидає
змінну lock в початкове значення.
Лістинг 6 – Критичні секції на основі інструкції «перевірити-
перевірити-встановити»
bool lock = false;/* спільна змінна блокування */
process CS[i = 1 to n] {
while (true) {
while (lock) skip;/* протокол входу */
while (TS(lock)) {
while (lock) skip;
}
критична секція;
lock = false;/* протокол виходу */
некритична секція;
}
}
10.4 Способи реалізації операторів await
Будь-яке рішення задачі критичної секції можна використо-
вувати для реалізації безумовної неподільної дії < S; >, прихо-
вуючи при цьому внутрішні контрольні точки від інших процесів.
Нехай CSenter – вхідний протокол критичної секції, a CSexit –
вихідний протокол. Тоді дію < S; > можна реалізувати наступ-
ним чином:
CSenter;
S;
CSexit;
В даному випадку передбачається, що всі секції коду проце-
сів, які модифікують або посилаються на змінні, що змінюються
в S (або модифікують змінні, на які посилається S), захищені ана-
логічними вхідними та вихідними протоколами. По суті, дужки
< та > замінені процедурами CSenter та CSexit.
84