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- це приклад задачі