Page 103 - 4868
P. 103
101 Ошибка! Стиль не определен.
описано в лістингу 1.24. Для виходу із неподільних дій використовується код
помічений через SIGNAL.
if (nw == 0 and dr > 0) {
dr = dr-1;
V(r);
# відновити процес-читач, або
}elseif (nr == 0 and nw == 0 and dw > 0) {
dw = dw-1;
V(w);
# відновити процес-письменник, або
}else{
V(e);
# звільнити блокування входу
}
Роль коду SIGNAL полягає у сигналізації тільки одному із трьох
семафорів. Це означає, що якщо немає активних письменників, але є
призупинений читач, то він може бути продовжений за допомогою операції
V(r). Якщо немає активних читачів або письменників, але є призупинений
письменник, то він може бути продовжений за допомогою операції V(w). В
іншому випадку, якщо немає відкладених процесів, які можна безпечно
продовжити, то вхідний семафор отримає сигнал за допомогою операції
V(e).
Лістинг 1.24 – Реалізація схеми читачів і письменників за допомогою
методу передачі естафети
int nr = 0, nw = 0;
sem e = 1, # керує входом в критичні секції
r = 0, # використовується для призупинення читачів
w = 0; # використовується для призупинення письменників
# завжди 0 <= (e+r+w) <= 1
int dr = 0, # число призупинених читачів
dw = 0; # число призупинених письменників
process Reader[і = 1 to M] {
while (true) {
# <await (nw == 0) nr = nr+1; >
P(e);
if (nw> 0) {
dr = dr+1;
V(e);
P(r);
}
nr = nr+1;
SIGNAL;
зчитати базу даних;
# <nr = nr-1; >