Ni donas ekzemplan solvon de tiu problemo en Ada
(laù N. Gehani. Ada: An advanced introduction). Ĉiu pensisto estas
mortema kaj forpasas baldaŭ post la centmila manĝado.
PROCEDURE mangxado IS
SUBTYPE n_ro IS INTEGER RANGE 1..5; -- identigas pensiston, forkon
TASK TYPE pensisto IS
ENTRY nomizo(j: n_ro); -- por sciigi al la pensisto lian n-ron
END pensisto;
TASK TYPE forko IS
ENTRY prenu; ENTRY remetu;
END forko;
ilo: ARRAY (n_ro) OF forko;
ulo: ARRAY (n_ro) OF pensisto;
TASK TYPE pasejo IS
ENTRY enen; ENTRY elen;
END pasejo;
TASK BODY forko IS
BEGIN
LOOP
SELECT
ACCEPT prenu; ACCEPT remetu;
OR TERMINATE;
END SELECT;
END LOOP;
END forko;
TASK BODY pasejo IS
n: INTEGER := 0;
BEGIN
LOOP
SELECT
WHEN n<4 => ACCEPT enen; n:=n+1;
OR ACCEPT elen; n:=n-1;
OR TERMINATE;
END SELECT;
END LOOP;
END pasejo;
TASK BODY pensisto IS
memo: n_ro; -- sia nomo;
morta_mangxo: CONSTANT := 100_000;
mangxite: INTEGER := 0;
liva, dekstra: n_ro; -- forkoj;
BEGIN
ACCEPT nomizo(j: n_ro) DO
memo := j;
END nomizo;
liva:=memo;
dekstra := memo MOD 5 + 1;
WHILE
mangxite /= morta_mangxo
LOOP
-- la filozofo pensadu ĝis malsatiĝo
pasejo.enen;
ilo(dekstra).prenu; ilo(liva).prenu; -- la forkojn;
-- la filozofo iom manĝu
ilo(liva).remetu; ilo(dekstra).remetu; -- la forkojn;
mangxite := mangxite+1;
pasejo.elen;
END LOOP;
END pensisto;
BEGIN --------- komenco de la tuta mangxado:
FOR k IN n_ro LOOP
ulo(k).nomizo(k);
END LOOP;
END mangxado;