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; >
   98   99   100   101   102   103   104   105   106   107   108