Page 128 - 6571
P. 128
Оператор B визначає логічний вираз, a S – список операторів,
що повинні бути виконані в одній неподільній дії, якщо B має
значення «істина». Останні два неподільні оператори в обох
процесах мають наступний вигляд:
< S; >
За допомогою першої форми може бути представлена будь-
яка умовна синхронізація, а друга форма є її скороченням для
часткового випадку, в якому значення умови B є незмінним та
рівним «істина».
Для реалізації операторів await з лістингу 23 можна
скористатися описаними раніше спільними двійковими
семафорами. Нехай e – двійковий семафор з початковим
значенням 1, який використовується для керування входом (entry)
у будь-яку неподільну дію.
З кожною умовою захисту B повинен бути зв’язаний один
семафор і один лічильник з нульовими початковими значеннями.
Семафор необхідний для призупинення процесу до моменту,
коли умова захисту стане рівною «істина». У лічильнику в свою
чергу зберігається число призупинених процесів. У програмі з
лістингу 23 визначено дві різні умови захисту, по одній в
протоколах входу письменників і читачів, тому потрібні два
семафора і два лічильника. Нехай r – семафор, пов’язаний з
умовою захисту в процесі-читача, a відповідно dr – лічильник
призупинених процесів-читачів. Аналогічно нехай з умовою
захисту в процесі-письменника пов’язані семафор w і лічильник
призупинених процесів-письменників dw. Під час ініціалізації
програми в стані очікування не перебуває жоден із процесів
читачів або письменників, тому значення змінних r, dr, w і dw
рівні 0.
Використання трьох семафорів (e, r та w) і двох лічильників
(dr та dw) описано в лістингу 24.
Лістинг 24 – Реалізація схеми читачів і письменників за до-
помогою методу передачі естафети
int nr = 0, nw = 0;
sem e = 1, # керує входом в критичні секції
r = 0, # використовується для призупинення читачів
127