Page 85 - 6571
        P. 85
     TS. Опишемо способи подальшого усунення конфліктів звернен-
            ня до пам’яті.
                  У  лістингу  6  представлено  повне  рішення  задачі  критичної
            секції,  що  використовує  вхідний  протокол  «перевірити-
            перевірити-встановити».  Як  і  раніше,  протокол  виходу  скидає
            змінну lock в початкове значення.
                  Лістинг 6 – Критичні секції на основі інструкції «перевірити-
            перевірити-встановити»
                  bool lock = false;/* спільна змінна блокування */
                  process CS[i = 1 to n] {
                    while (true) {
                      while (lock) skip;/* протокол входу */
                      while (TS(lock)) {
                        while (lock) skip;
                      }
                      критична секція;
                      lock = false;/* протокол виходу */
                      некритична секція;
                    }
                  }
                  10.4 Способи реалізації операторів await
                  Будь-яке рішення задачі критичної секції можна  використо-
            вувати для реалізації безумовної неподільної дії < S; >, прихо-
            вуючи при цьому внутрішні контрольні точки від інших процесів.
            Нехай CSenter – вхідний протокол критичної секції, a CSexit –
            вихідний протокол. Тоді дію < S; > можна реалізувати наступ-
            ним чином:
                  CSenter;
                    S;
                  CSexit;
                  В даному випадку передбачається, що всі секції коду проце-
            сів, які модифікують або посилаються на змінні, що змінюються
            в S (або модифікують змінні, на які посилається S), захищені ана-
            логічними  вхідними  та  вихідними  протоколами.  По  суті,  дужки
            < та > замінені процедурами CSenter та CSexit.
                                                        84





