- •23. Задачи (язык Ада) Описание тела задачи
- •Инициирование задачи, пример
- •Синхронизация, механизм рандеву
- •Взаимное исключение
- •Пример. Реализация механизма семафоров
- •Пример. Реализация механизма сигналов
- •Описание задачи (опционально)
- •Описание задачи, пример (опционально)
- •Пример «Почтовый ящик» (опционально)
- •Пример «Почтовый ящик» (опционально)
- •Пример «Почтовый ящик» (опционально)
- •24. Отбор среди входов
- •Пример. Задача «Поставщик- Потребитель»
- •begin Задача «Поставщик-Потребитель»
- •Оператор отбора среди входов (опционально)
- •Отбор среди входов (опционально)
- •25. Задача «Обедающие философы»
- •Задача «Обедающие философы»
- •Задача «Обедающие философы»
- •Задача «Обедающие философы»
23. Задачи (язык Ада) Описание тела задачи
task body is <имя_задачи> <описание_данных>
begin <описание_действий>
end <имя_задачи>;
8. Задачи в АДА, механизм рандеву |
|
1 |
|
Сидельников В.В. vvs_home@list.ru |
2011 v.01 |
||
|
Инициирование задачи, пример
program Турист
task body Встреча is; begin
. . .
end Встреча;
task body Багаж is; begin
. . .
end Багаж;
begin initiate(Встреча); initiate(Багаж);
end Турист;
Турист Встреча Багаж
Неявная инициализация:
begin nill;
end Турист;
8. Задачи в АДА, механизм рандеву |
|
2 |
|
Сидельников В.В. vvs_home@list.ru |
2011 v.01 |
||
|
Синхронизация, механизм рандеву
Вызов входа: |
|
|
|
|
|
|
|
|
Вход: |
|
|
|
|
|
|
|||||||||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
task body A1 is |
|
|
|
|
|
|
|
|
task body A2 is |
|
|
|
|
||||||||||||||
|
|
|
|
|
|
|
|
|
begin |
|
|
|
|
|
|
|||||||||||||
|
begin |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|||||||||||||
|
|
|
|
|
|
|
|
|
. . . |
|
|
|
|
(2) |
||||||||||||||
|
. . . |
|
(1) |
|
|
|
accept R do |
|
|
|||||||||||||||||||
|
A2.R; |
|
|
|
|
|
<обработка входа> |
|||||||||||||||||||||
|
. . . |
|
|
|
|
|
|
|
|
|
end; |
|
|
(3) |
||||||||||||||
|
end A; |
|
|
|
|
|
|
|
|
. . . |
|
|
|
|
|
|
|
|
||||||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
end A; |
|
|
|
|
|
|
|||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
|
|
|
|
|
|
t |
1 |
|
|
|
|
|
|
|
t |
|||||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
||||||||||||||
|
A1 |
|
|
|
|
|
|
|
|
|
|
|
|
A1 |
|
|
|
|
|
|
|
|
||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
||||||||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
I |
|
|
|
|
|
|
|
ждет |
|
|
|
3 |
|
II |
|
|
|
2 |
|
|
|
ждет |
|
3 |
||||
|
|
|
|
|
|
|
|
|
|
|
|
|||||||||||||||||
|
|
|
|
|
|
|
|
|
|
|
|
|||||||||||||||||
|
|
|
|
|
|
|
|
|
|
|
|
|||||||||||||||||
|
|
|
|
|
|
|
|
|
|
|
|
|||||||||||||||||
|
|
|
|
|
|
|
|
|
|
|
|
|||||||||||||||||
|
|
|
|
|
2 |
|
|
|
|
|
|
|
|
|
|
|
|
|||||||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
||||||||||||
|
|
|
|
|
|
|
|
|
||||||||||||||||||||
|
|
|
|
|
|
|
|
|
|
|
|
|||||||||||||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
||||||||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
||||||||||||||||
|
A2 |
|
|
|
|
|
|
|
|
|
|
|
|
|
t |
A2 |
|
|
|
|
|
|
|
|
|
|
t |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
||||||||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
||||||||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|||||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
ждет
8. Задачи в АДА, механизм рандеву |
|
3 |
|
Сидельников В.В. vvs_home@list.ru |
2011 v.01 |
||
|
Взаимное исключение
task body A1 is
begin
. . .
B.R;
. . .
end A;
task body An is
begin
. . .
B.R;
. . .
end A;
task body B is
begin loop
accept R do
. . .
end; end loop;
end A;
ОчередьДоступаКоВходу_R
8. Задачи в АДА, механизм рандеву |
|
4 |
|
Сидельников В.В. vvs_home@list.ru |
2011 v.01 |
||
|
Пример. Реализация механизма семафоров
task body Процесс_1; |
|
|||
begin |
|
|||
. . . |
|
|
||
Семафор.P; |
|
|||
КритическаяСекция_1; |
task body Семафор; |
|||
Семафор.V; |
begin |
|||
. . . |
|
loop |
||
end; |
accept P do end; |
|||
|
|
|
accept V do end; |
|
task body Процесс_2; |
||||
end loop; |
||||
begin |
end Семафор; |
|||
. . . |
|
|
||
Семафор.P; |
|
|||
КритическаяСекция_2; |
|
|||
Семафор.V; |
|
|||
|
||||
. . . |
|
|
||
end; |
|
8. Механизм рандеву |
|
5 |
|
Сидельников В.В. vvs_home@list.ru |
2011 v.02 |
||
|
Пример. Реализация механизма сигналов
task body Процесс_1; begin
loop
. . .
Сигнал.Ждать;
. . .
end loop; end;
task body Процесс_N; begin
loop
. . .
Сигнал.Послать;
. . .
end loop; end;
task body Сигнал; begin
loop
accept Послать do end; if Ждать’COUNT > 0 then accept Ждать do end;
end if; end loop; end Сигнал;
8. Механизм рандеву |
|
6 |
|
Сидельников В.В. vvs_home@list.ru |
2011 v.02 |
||
|
Описание задачи (опционально)
Спецификация задачи:
task <имя_задачи> is
entry <имя_входа> [(формальные_параметры)] end <имя_задачи>;
Тело задачи:
task body is <имя_задачи> <описание_данных>
begin <описание_действий>
accept <имя входа> [(<формальные параметры>)] do <описание_действий_входа>
end; <описание_действий>
end <имя_задачи>;
8. Задачи в АДА, механизм рандеву |
|
7 |
|
Сидельников В.В. vvs_home@list.ru |
2011 v.01 |
||
|
Описание задачи, пример (опционально)
program Преобразование_символа;
task Читать;
task Преобразовать
entry R(P: in CHARACTER); end Преобразовать;
task body Читать; Сh: CHARACTER; X: FILE;
begin
Open (X);
while not EOF(X) loop
Get(Ch);
Преобразовать.R(Ch); end loop;
Close(X) end Читать;
task body Преобразовать;
Y: CHARACTER; begin
loop
accept R(P: in CHARACTER) do
Y:= P;
end;
Put(UPPER(Y)); end loop;
end;
begin nill;
end.
8. Задачи в АДА, механизм рандеву |
|
8 |
|
Сидельников В.В. vvs_home@list.ru |
2011 v.01 |
||
|
Пример «Почтовый ящик» (опционально)
task body ПочтовыйЯщик;
Буфер: СООБЩЕНИЕ; begin
loop
accept Отправить(Передача: in СООБЩЕНИЕ) do Буфер:= Передача;
end;
accept Принять(Прием: out СООБЩЕНИЕ) do Прием:= Буфер;
end; end loop;
end Почтовый_Ящик;
Отправитель ПочтовыйЯщик Получатель
8. Задачи в АДА, механизм рандеву |
|
9 |
|
Сидельников В.В. vvs_home@list.ru |
2011 v.01 |
||
|
Пример «Почтовый ящик» (опционально)
task body Отправитель; begin
loop
. . .
ПочтовыйЯщик.Отправить(Послание);
. . .
end loop; end Отправитель;
task body Получатель; begin
loop
. . .
ПочтовыйЯщик.Принять(Послание);
. . .
end loop; end Получатель;
8. Задачи в АДА, механизм рандеву |
|
10 |
|
Сидельников В.В. vvs_home@list.ru |
2011 v.01 |
||
|