Metrós szimuláció
A legutóbbi két írásunkban az Ada programozási nyelv által biztosított párhuzamos programozást segítő nyelvi elemekkel kezdtük el ismerkedni. A továbbiakban ezeket az ismereteinket bővítjük két ehhez szorosan kapcsolódó fogalommal (és a hozzájuk tartozó nyelvi eszközökkel)
, a szinkronizációval és a kommunikációval.
A szinkronizáció nem más, mint a folyamatok / taszkok összehangolása, olyan módon, hogy biztosítsuk számukra az információcserét, melyet kommunikációnak hívunk. Ezt a célt szolgálja - Ada az nyelv terminológiáját használva - a randevú.
Egy randevúban mindig két taszk vesz részt. Az egyik meghívja a másik belépési pontját (entry) a másik pedig fogadja a hívást (accept). A hívó a hívásnál, a hívott az acceptnél blokkolódik! A randevú az accept utasítás végrehajtásából áll.
Egy randevúban a hívó ismeri a hívottat, de ez fordítva nem igaz.
A most bemutatásra kerülő programunkban számos példát mutatunk arra, hogyan adhatnak át információkat a taszkjaink egymásnak, és, hogy ezáltal hogyan befolyásolhatják egymás futását. Ezeknek az interakcióknak a megtervezése nem egyszerű feladat. Fontos szemelőt tartanunk, hogy egy „helyes” programnak bármely ütemezés mellett „helyesnek” kell lennie. Figyelni kell az esetleges interferenciák (amikor a taszkjaink önmagukban helyesen működnek, de együttes viselkedésük hibás), valamint a holtpont és a kiéheztetés elkerülésére is.
Emlékezzünk rá, hogy az Ada nyelv nem tesz megkötést arra, hogy egy adott Ada implementációban az ütemezés milyen algoritmussal történik.
parhuzamos_kepernyo_kezeles.ads
parhuzamos_kepernyo_kezeles.adb
metros_szimulacio_elemei.ads
metros_szimulacio_elemei.adb
metros_szimulacio.adb
magyarázat:
A programban számos példa található arra is, hogy hogyan akadályozhatjuk meg, hogy a gépelési hibákból komoly, a működést befolyásoló hibák keletkezzenek. Erre szolgálnak a csomagok privát részében elhelyezett védett egységek, valamint típusok és a metrók számát meghatározó konstans is.
kiegészítés:
„aszinkron select”
Néha előfordul, hogy egy megszakítható utasítássorozatot szeretnénk végrehajtani... (és egy példa vegyes felsorolási típusra)