Page 44 - 4868
P. 44

Ошибка! Стиль не определен.                                                                42

               гілку  оператора  co.У  лістингу  1.1  показано  рішення,  яке  використовує  цей
               підхід.Дана  програма  є  прикладом  схеми  типу  «виробник-споживач».Тут
               перший процес є виробником, а другий – споживачем.Вони взаємодіють за
               допомогою  спільної  змінної  buffer.Відзначимо,  що  змінніline1таline2
               тепер стали локальними для процесів, оскільки рядки вже не є спільними для

               процесів.
                     Стиль програми, наведеної в лістингу 1.1, називається «while всередині
               co», на відміну від стилю «co всередині while», використаного в попередніх
               рішеннях.Перевага стилю «while всередині co» полягає в тому, що процеси
               створюються тільки один раз, а не при кожному повторенні циклу.Недоліком
               є     необхідність       використовувати          два      буфера       і    програмувати
               синхронізацію.Оператори,  що  передують  зверненню  до  спільного  буферу
               buffer і наступні за ним, вказують тип необхідної синхронізації.

                     Лістинг 1.1– Пошук шаблонів у файлі
                     string buffer; # містить один рядок вводу
                     bool done = false; # сигналізація про завершення
                     co # Процес 1: знайти шаблони
                       string line1;
                       while (true) {
                         очікувати заповнення буфера або значенняtrue змінної done;
                         if (done) break;
                         line1 = buffer;
                         сигналізувати, що буфер порожній;
                         шукатиpattern в line1;
                         if (pattern є в line1) надрукувати line1;
                       }
                     // # Процес 2: прочитати нові рядки
                       string line2;
                       while (true) {
                         прочитати наступний рядок вводу вline2;
                         if (EOF) {
                           done = true;
                           break;
                         }
                       очікувати очищення буфера;
                       buffer = line2;
                       сигналізувати про заповнення буфера;
                       }
                     oc;


                     6.3. Синхронізація (задача пошуку максимального елемента масиву)
                     Розглянемо  іншу  задачу,  яка  вимагає  синхронізації  процесів.Вона
               полягає  у  пошуку  максимального  елемента  масивуa[n].Припустимо,  щоn
               додатне число і всі елементи масиву є додатні цілі числа.
                     Пошук  максимального  елемента  в  масивіa-  це  приклад  задачі
   39   40   41   42   43   44   45   46   47   48   49