Page 42 - 4868
P. 42
Ошибка! Стиль не определен. 40
порядок виконання оновлень не впливає (не псує) на вид екрану.
Повернемося до задачі пошуку шаблону в файлі.Які частини програми
незалежні і, отже, можуть бути виконані паралельно?Програма починається
із зчитування першого рядка вводу, щоповинно бути виконано перед усіма
іншими діями.Після цього програма входить в цикл пошуку шаблону,
виводить рядок, якщо шаблон був знайдений, а потім зчитує новий
рядок.Вивести рядок до того, як у ньому був виконаний пошук шаблону, не
можна, тому перші два рядки циклу виконати паралельно неможливо.Однак
можна прочитати наступний рядок вводу під час пошуку шаблону в
попередньому рядку і можливо його друк.Отже, розглянемо іншу,
паралельну версію попередньої програми.
string line;
прочитати вхідний рядок зstdin в line;
while (!EOF) {
coшукати pattern в line;
if (pattern є в line) вивести line;
// прочитати наступний рядок вводу і записати його вline;
oc;
}
За замовчуванням оператори виконуються послідовно, тобтоодин за
одним.Оператор co(concurrent – паралельний) вказує, що декілька операторів
можуть виконуватися паралельно.Одна із форм оператораco має декілька
гілок(arms).
co
// оператор_1;
// ...
// оператор_n;
oc
Кожна гілка включає оператор (або список операторів).Гілки
відокремлюються символом паралелізму //.Оператор, наведений вище,
означає наступне: «почати паралельне виконання всіх операторів, після чого
очікувати їх завершення».Таким чином, оператор co завершується після
виконання всіх його операторів.
Відзначимо, що перша гілка оператора co є послідовністю
операторів.Але чи є незалежними ці два процеси програми?Відповідь – ні,
оскільки перший зчитує змінну line, а другий записує в неї.Тому, якщо
другий процес виконується швидше за перший, то він буде перезаписувати
рядок до того, як його встигне перевірити перший процес.
Як було відзначено вище, частини програми можуть виконуватися
паралельно тільки в тому випадку, якщо вони зчитують і записують різні
змінні.Припустимо, що другий процес записує не в ту змінну, яку перевіряє
перший процес, і розглянемо наступну програму.
string line1, line2;
прочитати рядок вводу зstdin в line1;