Составители:
11) < await (!in1) in2 = true; > # вход
12) [критическая секция];
13) in2 = false; # выход
14) [некритическая секция];
15) }
16) }
§2 Активные блокировки
Можно рассм отреть произвольн ое число n процессов, но использо-
вать одну логическую переменную (вместо n логических перемен-
ных в каждом пр оцес се).
Пусть lock — логическая переменная. Если один из процес-
сов находится вкритической секции, то в предыдущей программе
in1 ∨ in2 == true. Пусть lock принимает значение true, если про-
цесс находится в критической секции, а если нет процессов в крити-
ческой секции, то true = false. Проиллюстрируем использование
этой переменной для двух процессов (n = 2).
Замечание. Инвариант, рассмотренный выше (а именно,
¬(in1∧in2)) нельзя сформулировать при помощи переменной lock.
Однако, использование lock позволяет поддерживать этот инвари-
ант; это вытекает из след ующего п рим ер а.
bool lock = false;
process CS1 {
while (true) {
< await (!lock) lock = true; > # если !lock, то вход
# разрешен: входим. . .
[критическая секция];
lock = false; # выходим из критической секции и сразу
# устанавливаем lock = false
[некритическая секция];
}
}
process CS2 {
46
Страницы
- « первая
- ‹ предыдущая
- …
- 43
- 44
- 45
- 46
- 47
- …
- следующая ›
- последняя »
