Составители:
[искать pattern в line1];
if ([pattern есть в line1])
[вывести line1];
// [прочитать следующую строку в line2];
oc;
line1 = line2;
}
Итак, процессы внутри оператора co независимы, но их дей-
ствия связаны последним присваиванием. Теперь программа ра-
ботает правильно, но совершенн о неэффективно: 1) копирование
line2 в line1 ведет к перезаписи большого числа символов; 2) опе-
ратор распараллеливания co находится в теле цикла, и поэтому при
каждом повторении цикла будут возобновляться и уничтожать-
ся два процесса, что ведет к доп олни тельн ым накладным расходам
(ибо созд ание и уничтожение процесса требует значительно больше
времени, чем вызов процедуры).
Есть более эффективная параллельная программа: 1) следует
поместить цикл while в каждый процесс оператора co; 2) взаимо-
действие процессов проводить ч ере з общую буферную переменную
buffer (а переменные line1 и line2 — локальные для процессов).
string buffer; # содержит одну строку ввода
bool done = false; # используется для сигнала о завершении
co # процесс 1 - поиск шаблона в строках и печатание строк
string line1;
while (true) {
[ожидание заполнения буфера или true в переменной done];
if (done) break; # выход из ц ик ла
line1 = buffer;
[сигнализировать, что буфер пуст];
[искать pattern в line1];
if ([pattern есть в line1])
[напечатать line1];
23
Страницы
- « первая
- ‹ предыдущая
- …
- 20
- 21
- 22
- 23
- 24
- …
- следующая ›
- последняя »