Page 89 - 6571
P. 89

випадку немає необхідності в неподільному обчисленні умов за-
            тримки.

                  Лістинг  7  –  Алгоритм  розриву  вузла  для  двох  процесів

            (крупномодульне рішення)
                  bool in1 = false, in2 = false;
                  in1 last = 1;
                  process CS1 {
                    while (true) {

                      last = 1;
                      in1 = true; /* протокол входу */
                      <await (!in2 or last == 2);>
                        критична секція;
                      in1 = false; /* протокол виходу */
                      некритична секція;
                    }
                  }
                  process CS2 {
                    while (true) {
                      last = 2; in2 = true; /* протокол входу */
                      <await (!in1 or last == 1);>
                        критична секція;
                      in2 = false; /* протокол виходу */
                      некритична секція;
                    }
                  }

                  Оскільки  умову  закінчення  затримки  не  обов’язково  обчис-

            лювати неподільним чином, кожен оператор await можна замі-
            нити циклом while, який повторюється, поки умова закінчення
            затримки має значення «хиба». Таким чином, отримуємо дрібно-

            модульний алгоритм розриву вузла представлений в лістингу 8.

                  Лістинг  8  –  Алгоритм  розриву  вузла  для  двох  процесів
            (дрібномодульне рішення)

                  bool in1 = false, in2 = false;
                  int last = 1;
                  process CS1 {
                    while (true) {
                      last = 1;
                      in1 = true; /* протокол входу */
                      while (in2 and last == 1) skip;

                                                        88
   84   85   86   87   88   89   90   91   92   93   94