Page 143 - 6571
P. 143
дури release_write точно відомо, що значення обох змінних
nr та nw дорівнюють нулю. Отже, може продовжити роботу будь-
який призупинений процес. Рішення з лістингу 27 не встановлює
порядок чергування процесів-читачів і процесів-письменників.
Замість цього дана програма запускає всі призупинені процеси і
дозволяє стратегії планування процесів визначити, який з них пе-
ршим отримає доступ до бази даних. Якщо це процес-
письменник, то будуть призупинені всі процеси-читачі. Якщо ж
першим отримає доступ процес-читач, то призупиниться запуще-
ний процес-письменник.
Лістинг 27 – Рішення задачі про читачів та письменників з
використанням моніторів
monitor RW_Controller {
int nr = 0, nw = 0;
cond oktoread; # отримує сигнал, коли nw == 0
cond oktowrite; # отримує сигнал, коли nr == 0 та
nw == 0
procedure request_read() {
while (nw > 0) wait(oktoread);
nr = nr+1;
}
procedure release_read() {
nr = nr-1;
if (nr == 0) signal(oktowrite);
# запустити один процес-письменник
procedure request_write() {
while (nr > 0 || nw > 0) wait(oktowrite);
nw = nw+1;
}
procedure release_write() {
nw = nw-1;
signal(oktowrite); # запустити один процес-
письменник та
signal_all(oktoread); # всі процеси-читачі
}
}
142