Page 89 - 6571
P. 89
випадку немає необхідності в неподільному обчисленні умов за-
тримки.
Лістинг 7 – Алгоритм розриву вузла для двох процесів
(крупномодульне рішення)
bool in1 = false, in2 = false;
in1 last = 1;
process CS1 {
while (true) {
last = 1;
in1 = true; /* протокол входу */
<await (!in2 or last == 2);>
критична секція;
in1 = false; /* протокол виходу */
некритична секція;
}
}
process CS2 {
while (true) {
last = 2; in2 = true; /* протокол входу */
<await (!in1 or last == 1);>
критична секція;
in2 = false; /* протокол виходу */
некритична секція;
}
}
Оскільки умову закінчення затримки не обов’язково обчис-
лювати неподільним чином, кожен оператор await можна замі-
нити циклом while, який повторюється, поки умова закінчення
затримки має значення «хиба». Таким чином, отримуємо дрібно-
модульний алгоритм розриву вузла представлений в лістингу 8.
Лістинг 8 – Алгоритм розриву вузла для двох процесів
(дрібномодульне рішення)
bool in1 = false, in2 = false;
int last = 1;
process CS1 {
while (true) {
last = 1;
in1 = true; /* протокол входу */
while (in2 and last == 1) skip;
88