Page 103 - 6571
P. 103
синхронізації за допомогою прапорців: 1) прапорець синхронізації
скидається тільки процесом, який очікує його установки; 2)
прапорець не можна встановлювати до тих пір, поки не відомо
точно, що він скинутий.
Перше правило гарантує, що прапорець не буде скинутий,
поки процес не визначить, що він встановлений. Відповідно з цим
правилом, прапорець continue[і] повинен скидатися процесом
Worker[і], а обнуляти всі елементи масиву arrive повинен
процес Coordinator. Згідно з другим правилом процес не
встановлює прапорець до того часу, поки він не скинутий іншим
процесом. В протилежному випадку, якщо інший
синхронізований процес очікує повторної установки прапорця, то
можлива ситуація взаємного блокування. Це означає, що процес
Coordinator повинен скинути значення arrive[і] перед
установкою значення змінної continue[і]. Процес
Coordinator може зробити це, виконавши ще один оператор
for після першого оператора for. Також процес Coordinator
може скинути значення arrive[і] відразу після того, як
дочекається його установки. Додавши код скидання прапорців,
отримаємо бар’єр з керуючим процесом
(лістинг 14).
Лістинг 14 – Бар’єрна синхронізація з керуючим процесом
int arrive[1: n] = ([n] 0), continue[1: n] = ([n] 0);
process Worker[i = 1 to n] {
while (true) {
код рішення задачі i;
arrive[i] = 1;
<await (continue[i] == 1);>
continue[i] = 0
}
}
process Coordinator {
while (true) {
for [i = 1 to n] {
< await (arrive[i] == 1);>
arrive[i] = 0;
}
for [i = 1 to n] continue[i] = 1;
}
102