Rendez-Vous, vč. select v Adě, a jeho porovnání s monitorem. 
Thursday, May 30, 2013
8:33 AM
Ada je objektově orientovaný jazyk se silnou verifikací typů (nelze implicitně přetypovat datové typy – např. void pointer)
nepoužívá interpretr
nepodporuje fibres
paralelní části výpočtu se označují jako tasky (ne thready)
mohou být prováděny na jednom procesoru, více procesorech nebo více počítačích, není to však vyjádřeno v kódu programu
pro synchronizaci tasků se používá asymetrické synchronní rendezvous (zasílání zpráv)
Tasky
Konstrukce task představuje program paralelně proveditelného procesu, schopného komunikace s ostatními procesy.
task jméno is
deklarace jmen komunikačních typů
task body jméno is
lokální deklarace a příkazy
pro ukončení procesu lze použít příkaz abort jméno;, ale jeho použití by mělo být výjimečné
k ukončení tasku se používá příkaz terminate
Select
Accept e
Or 
Terminate
End select
Rendez-vous
Pro interakci procesů používá ADA principu asymetrického rendezvous, kterým eliminuje potřebu semaforů (umí je nahradit), umožňuje synchronní a nepřímo (zavedením pomocného procesu) i asynchronní komunikaci procesů zasíláním zpráv. Dovoluje tak elegantní konstrukci monitorů. 
prostředek pro synchronizaci úkolů (tasks)
dva úkoly spolu komunikují pomocí rendez-vous - Meeting point, entry calls
task je uspán do té doby, než se dostaví druhý task, který s ním chce komunikovat
task Simple_Task is
entry Start(Num : in Integer);
entry Report(Num : out Integer);
end Simple_Task;
task body Simple_Task is
Local_Num : Integer;
begin
//čeká na vložení čísla – entry call
accept Start(Num : in Integer) do
Local_Num := Num;
end Start;
//normálně pokračuje v běhu
Local_Num := Local_Num * 2;
//čeká na vyzvednutí spočítané hodnoty
accept Report(Num : out Integer) do
Num := Local_Num;
end Report;
end Simple_Task;
uvedený příklad stačí, pouze pokud potřebujeme jen jedno vlákno běžící podle uvedeného kódu
průběh dostaveníčka - accept:
klient zavolá server
server si převezme parametry
server provede výpočet, klient spí
server předá výsledky
Select - může být nezbytné, aby úkol mohl reagovat na několik vstupních volání (entry calls) – pokaždé na jiné dle okolností – tj. ne v předem určeném pořadí
//Vynutíme si inicializaci a další se
//už pak může vykonávat v libovolném
//pořadí.
accept Init(Item : in Integer) do
Local_Item := Item;
end Init;
loop
select
accept Stop;
exit;
or
when podmínka = > //může i nemusí být
accept Put(Item : in Integer) do
Local_Item := Item;
end Put;
Local_Item := Local_Item * 2;
else
Put_Line("No entry call at this time");
end select;
delay 0.01;
end loop;
Protected Objects, Protected Types
tasky mohou sdílet objekty
objekt je instance typu – klíčové slovo type
klíčové slovo protected zajistí exkluzivní přístup k chráněnému objektu
jsou tři operace nad chráněnými objekty:
Procedury – mění stav objektu, aniž by pro to musela být splněna podmínka; překladač se stará, aby měly exkluzivní přístup k objektu
Entry calls – stejné jako procedury, ale pro vykonání entry call je třeba navíc splnit podmínku
Funkce – pouze vrací stav a nic nemění, a proto nemusí mít exkluzivní přístup k objektu
Porovnání s monitorem
Rendezvous vs. monitors
The previous example is highly reminiscent of the monitor solution. Both provide “structured” approaches to mutual exclusion. Mutual exclusion is implicit in both monitors and rendezvous.
Passive and active objects
Monitors are passive objects.
• Only client threads exist.
• The client thread performs the service for itself inside the monitor.
• Server state does not change spontaneously.
Modules containing server threads are active objects.
• The server thread acts on behalf of the client thread within the module for the duration of the rendezvous.
• Server threads may change the module state in between calls from clients.
[link] - viz příloha
Renezvous v jave ze stranek zcu: [link]
From <[link]> no