Page 103 - 6571
P. 103

синхронізації за допомогою прапорців: 1) прапорець синхронізації
            скидається  тільки  процесом,  який  очікує  його  установки;  2)
            прапорець  не  можна  встановлювати  до  тих  пір,  поки  не  відомо
            точно, що він скинутий.

                  Перше  правило  гарантує,  що  прапорець  не  буде  скинутий,
            поки процес не визначить, що він встановлений. Відповідно з цим
            правилом, прапорець continue[і] повинен скидатися процесом

            Worker[і],  а  обнуляти  всі  елементи  масиву  arrive  повинен
            процес  Coordinator.  Згідно  з  другим  правилом  процес  не
            встановлює прапорець до того часу, поки він не скинутий іншим

            процесом.           В      протилежному              випадку,         якщо         інший
            синхронізований процес очікує повторної установки прапорця, то
            можлива ситуація взаємного блокування. Це означає, що процес

            Coordinator  повинен  скинути  значення  arrive[і]  перед
            установкою            значення          змінної        continue[і].              Процес
            Coordinator  може  зробити  це,  виконавши  ще  один  оператор

            for  після  першого  оператора  for.  Також  процес  Coordinator
            може  скинути  значення  arrive[і]  відразу  після  того,  як

            дочекається  його  установки.  Додавши  код  скидання  прапорців,
            отримаємо                бар’єр            з          керуючим                процесом
            (лістинг 14).


                  Лістинг 14 – Бар’єрна синхронізація з керуючим процесом
                  int arrive[1: n] = ([n] 0), continue[1: n] = ([n] 0);
                  process Worker[i = 1 to n] {

                    while (true) {
                      код рішення задачі i;
                      arrive[i] = 1;
                      <await (continue[i] == 1);>
                      continue[i] = 0
                    }
                  }
                  process Coordinator {
                    while (true) {
                      for [i = 1 to n] {
                        < await (arrive[i] == 1);>
                        arrive[i] = 0;
                      }
                      for [i = 1 to n] continue[i] = 1;
                    }

                                                        102
   98   99   100   101   102   103   104   105   106   107   108