Page 127 - 6571
P. 127
захисті операцій віднімання немає необхідності, оскільки процес,
що звільняє ресурс затримки не потребує. Після дотримання
необхідних для захисту умов отримаємо наступне
крупномодульне рішення, представлене у лістингу 23.
Лістинг 23 – Крупномодульне рішення задачі про читачів та
письменників
int nr = 0, nw = 0;
process Reader[i = 1 to M] {
while (true) {
...
<await (nw == 0) nr = nr+1; >
зчитати базу даних;
<nr = nr-1; >
}
}
process Writer[i = 1 to N] {
while (true) {
...
< await (nr == 0 and nw == 0) nw = nw+1; >
записати в базу даних;
<nw = nw-1; >
}
}
3. Рішення задачі про читачів та письменників через метод
передачі естафети. Іноді оператори await можна реалізувати
шляхом прямого використання семафорів або інших елементар-
них операцій, але в загальному випадку це неможливо. Розгляне-
мо дві умови захисту операторів await в лістингу 23. Дані умови
перекриваються: умова захисту в протоколі входу письменника
вимагає, щоб змінні nw та nr дорівнювали 0, а в протоколі входу
читача – тільки щоб змінна nw дорівнювала 0. Жоден семафор не
може розрізнити дані умови, тому для реалізації таких операторів
await, потрібен спільний метод, що називається передачею еста-
фети.
У лістингу 23 присутні чотири неподільних оператора. Перші
два (в процесах читача і письменника) мають вигляд:
<await (В) S; >
126