Page 102 - 4868
P. 102
Ошибка! Стиль не определен. 100
while (true) {
...
< await (nr == 0 and nw == 0) nw = nw+1; >
записати в базу даних;
<nw = nw-1; >
}
}
3.Рішення задачі про читачів та письменниківчерезметод передачі
естафети. Іноді оператори await можна реалізувати шляхом прямого
використання семафорів або інших елементарних операцій, але в загальному
випадку це неможливо. Розглянемо дві умови захисту операторів await в
лістингу 1.23. Дані умови перекриваються: умова захисту в протоколі входу
письменника вимагає, щоб змінні nw та nr дорівнювали 0, а в протоколі
входу читача – тільки щоб змінна nw дорівнювала 0. Жоден семафор не може
розрізнити дані умови, тому для реалізації таких операторів await, потрібен
спільний метод, що називається передачею естафети.
У лістингу 1.23 присутні чотири неподільних оператора. Перші два (в
процесах читача і письменника) мають вигляд:
<await (В) S; >
Оператор B визначає логічний вираз, a S – список операторів, що
повинні бути виконані в одній неподільній дії, якщоB має значення «істина».
Останні два неподільні оператори в обох процесах мають наступний вигляд:
< S; >
За допомогою першої форми може бути представлена будь-яка умовна
синхронізація, а друга форма є її скороченням для часткового випадку, в
якому значення умови B є незмінним та рівним «істина».
Для реалізації операторів await з лістингу 1.23 можна скористатися
описаними раніше спільними двійковими семафорами. Нехай e – двійковий
семафор з початковим значенням 1, який використовується для керування
входом (entry) у будь-яку неподільну дію.
З кожною умовою захисту B повинен бути зв’язаний один семафор і
один лічильник з нульовими початковими значеннями. Семафор необхідний
для призупинення процесу до моменту, коли умова захисту стане рівною
«істина». У лічильнику в свою чергу зберігається число призупинених
процесів. У програмі з лістингу 1.23 визначено дві різні умови захисту, по
одній в протоколах входу письменників і читачів, тому потрібні два
семафора і два лічильника. Нехай r – семафор, пов’язаний з умовою захисту
в процесі-читача, a відповідно dr – лічильник призупинених процесів-
читачів. Аналогічно нехай з умовою захисту в процесі-письменника пов’язані
семафор w і лічильник призупинених процесів-письменників dw. Під час
ініціалізації програми в стані очікування не перебуває жоден із процесів
читачів або письменників, тому значення змінних r, dr, w і dw рівні 0.
Використання трьох семафорів (e, r та w) і двох лічильників (dr та dw)