Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
СРВ_14_11_02_Рандеву в _Ада.ppt
Скачиваний:
4
Добавлен:
20.06.2023
Размер:
420.35 Кб
Скачать

Пример «Почтовый ящик» (опционально)

Буфер рассчитан только одно сообщение и увеличивать его нет смысла так как очень жесткий способ синхронизации, Принять и Отправить выполняются по очереди

8. Задачи в АДА, механизм рандеву

 

11

Сидельников В.В. vvs_home@list.ru

2011 v.01

 

24. Отбор среди входов

selectwhen (A) => accept X do

. . .

or

end;

when (B) => accept Y do

. . .

end; end select;

8. Задачи в АДА, механизм рандеву

 

12

Сидельников В.В. vvs_home@list.ru

2011 v.01

 

Пример. Задача «Поставщик- Потребитель»

 

.

Буфер

 

Поставщик

...

Потребитель

ТекущийЧтение ТекущийЗапись task body ПоставщикПотребитель;

Размер: constant INTEGER = 20;

Буфер: array(0..Размер) of СООБЩЕНИЕ;

ТекущийЗапись, ТекущийЧтение: INTEGER = 0; Количество: INTEGER = 0;

8. Задачи в АДА, механизм рандеву

 

13

Сидельников В.В. vvs_home@list.ru

2011 v.01

 

begin Задача «Поставщик-Потребитель»

loop select

when (Количество < Размер) =>

accept Записать(X: in СООБЩЕНИЕ) do Буфер(ТекущийЗапись):= X;

end;

ТекущийЗапись:=(ТекущийЗапись+1) mod Размер; Количество:= Количество + 1;

or

when (Количество > 0) =>

accept Прочитать(Y: out СООБЩЕНИЕ) do Y:= Буфер(ТекущийЧтение);

end;

ТекущийЧтение:=(ТекущийЧтение+1) mod Размер; Количество:= Количество - 1;

end select; end loop;

end ПоставщикПотребитель;

8. Задачи в АДА, механизм рандеву

 

14

Сидельников В.В. vvs_home@list.ru

2011 v.01

 

Оператор отбора среди входов (опционально)

select

[when <условие>=>] <отбираемая альтернатива>

[последовательность операторов]

{or

[when <условие>=>] <отбираемая альтернатива>

[последовательность операторов]}

[else

последовательность операторов] end select;

<отбираемая альтернатива>:

accept()

delay(<выражение, указывающее величину задержки>

8. Задачи в АДА, механизм рандеву

 

15

Сидельников В.В. vvs_home@list.ru

2011 v.01

 

Отбор среди входов (опционально)

1.Открытый вход – вход, у которого условие входа в данный момент является истинным

2.Если нет ни открытых операторов задержки, ни фразы else, задача будет неопределенно долго ждать вызова входа, связанного с открытым оператором входа accept и обработает первый поступивший вызов

3.Если имеется открытый оператор задержки, задача будет ожидать вызова входа для открытого оператора входа в течение заданного временного интервала, а затем выполнит соответствующую альтернативу.

4.Если нет ни открытых альтернатив, ни фразы else, возникает исключительная ситуация SELECT_ERROR

5.Если нет открытого оператора задержки, но есть фраза else, то задача немедленно приступит к выполнению части else.

8. Задачи в АДА, механизм рандеву

 

16

Сидельников В.В. vvs_home@list.ru

2011 v.01

 

25. Задача «Обедающие философы»

program ОбедающиеФилософы is

subtype ID is range 1..5;

Вилки: array(ID) of Вилка; Философы: array(ID) of Философ;

task body Вилка;

begin loop

select

accept ВзятьВилку; -- см.2, слайд 16 accept ПоложитьВилку;

end select; end loop;

end Вилка;

8. Задачи в АДА, механизм рандеву

 

17

Сидельников В.В. vvs_home@list.ru

2011 v.01

 

Задача «Обедающие философы»

task body Философ;

I: ID; begin

accept ПолучитьНомер(J in ID) do; I:= J;

end ПолучитьНомер; ЛеваяВилка:= I;

if(I=5)then ПраваяВилка:=1 else ПраваяВилка:= I+1;

loop

<здесь философ думает>

Вилки(ЛеваяВилка).ВзятьВилку; (*) Вилки(ПраваяВилка).ВзятьВилку;

<здесь философ ест>

Вилки(ЛеваяВилка).ПоложитьВилку; Вилки(ПраваяВилка).ПоложитьВилку;

end loop; end Философ;

8. Задачи в АДА, механизм рандеву

 

18

Сидельников В.В. vvs_home@list.ru

2011 v.01

 

Задача «Обедающие философы»

-- Инициирование задач begin

for K in ID loop

Философы(К).ПолучитьНомер(К); end loop;

end ОбедающиеФилософы;

Если все пять философов одновременно выполнят действие (*), то возникает тупиковая ситуация

8. Задачи в АДА, механизм рандеву

 

19

Сидельников В.В. vvs_home@list.ru

2011 v.01

 

Задача «Обедающие философы»

task body Хозяин;

I: INTEGER:= 0;

begin loop

select when(I<4)=>

accept Войти; I:= I + 1;

or

accept Выйти; -- см.2, слайд 16

I:= I - 1; end loop;

end Хозяин;

(Задание: Прописать использование задачи «Хозяин» в программе «ОбедающиеФилософы»)

8. Задачи в АДА, механизм рандеву

 

20

Сидельников В.В. vvs_home@list.ru

2011 v.01