Page 52 - 6571
P. 52

Отже,  чи  існує  ще  один  шлях  розпаралелювання  програми,
                  що  дозволяє  не  використовувати  оператор  co  всередині  циклу?
                  Замість  використання  оператора  co  всередині  циклу  while,

                  можна  помістити  цикли  while  в  кожну  гілку  оператора  co.  У
                  лістингу 1 показано рішення, яке використовує цей підхід. Дана
                  програма  є  прикладом  схеми  типу  «виробник-споживач».  Тут

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

                  оскільки рядки вже не є спільними для процесів.
                        Стиль програми, наведеної в лістингу 1, називається «while
                  всередині co», на відміну від стилю «co всередині while», вико-

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

                  ність використовувати два буфера і програмувати синхронізацію.
                  Оператори, що передують зверненню до спільного буферу buff-
                  er і наступні за ним, вказують тип необхідної синхронізації.


                        Лістинг 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) {

                                                              51
   47   48   49   50   51   52   53   54   55   56   57