Id: word;
14 CONST
15 N: word = 10;
16 BEGIN
17 Send (exportNUM_ITER, 0, N, SizeOf (word));
18 Task.N: = 10 * N;
19 Task.b: = 0;
20 FOR i: = 1 TO N DO BEGIN
21 Task.a: = Task.b;
22 Task.b: = i/N;
23 Receive (importDEMAND_LIST, WrkId, SizeOf (word));
24 Send (exportWORKER, WrkId, Task, SizeOf (Task));
25 END;
26 Task.N: = 0;
27 FOR i: = 1 TO exportWORKER.NChannels DO
28 Send (exportWORKER, i, Task, SizeOf (Task));
29 END;
Файл ManagerBody.pas: тіло процесу Manager
Мінлива Task описує завдання для робочого процесу: a, b - межі, N - число інтервалів. Константа N, описана в рядку 15, дорівнює числу разбиений відрізка [0; 1].
На початку роботи посилаємо процесу Summer число розбиття N (Рядок 17). У рядку 23 чекаємо запиту від одного з робочих процесів. Запит являє собою ідентифікатор запитуючої процесу. Отримавши запит, відсилаємо чергове завдання відповідному робочому (рядок 24).
Після того, як завдання розподілені, потрібно повідомити про це всім робочим процесам. Для цього служать рядки 26-28: по всіх каналах порту expWORKER посилаємо завдання з нульовим числом інтервалів - сигнал про завершення роботи.
30 PROCEDURE Body;
31 VAR
32 Task: RECORD N: word; a, b: real; END;
33 S: real;
34 i: word;
35 FUNCTION f (x: real): real;
36 BEGIN
37 Result: = 4/(1 + x * x);
38 END;
39 BEGIN
40 Send (ExportDEMAND, 0, GetProcessId, SizeOf (TProcessId));
41 WHILE (true) DO WITH Task DO BEGIN
42 Receive (importARG, Task, SizeOf (Task));
43 IF (Task.N = 0) THEN EXIT;
44 h: = (b-a)/N;
45 S: = 0;
46 FOR i: = 1 TO N DO
47 S: = S + f (a + (i-0.5) * h);
48 S: = h * S;
49 Send (exportPART_SUM, 0, S, SizeOf (S));
50 Send (exportDEMAND, 0, GetProcessId, SizeOf (TProcessId));
51 END;
52 END;
Файл WorkerBody.pas: тіло процесу Worker
Нескінченний цикл 41-51 забезпечує роботу процесу до отримання сигналу завершення від розподільника робіт Manager. br/>
У рядку 42 чекаємо чергове завдання Task. Якщо число інтервалів у завданні дорівнює 0, то завершуємо роботу. В іншому випадку обчислюємо часткову суму на інтервалі (Task.a; Task.b) і відсилаємо її суммирующему процесу (рядки 44-49). У рядку 50 звертаємося до розподільника робіт за черговим завданням.
53 PROCEDURE Body;
54 VAR
55 N: word;
56 i: word;
57 TotalSum, S: real;
58 BEGIN
59 Receive (ImportNUM_ITER, N, SizeOf (N));
60 TotalSum : = 0;
61 FOR i: = 1 TO N DO BEGIN
62 Receive (ImportPART_SUM, S, SizeOf (S...