Antaŭan 
paĝon! Indekson! Instrukcion!

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; 


Indekson Instrukcion
Hosted by uCoz