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