[Indekso][Instrukcio]


Problemo pri la mortemaj manĝantaj filozofoj

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;


[Indekso][Instrukcio]