1. cvičenie – Oboznámenie sa s prostredím ?

Ak ste už zvládli prípravu prostredia a viete ako komunikovať s interpreterom jazyka Python, môžete sa pustiť do cvičenia. Otvorte prostredie IDLE a zvoľte z ponuky File položku New File. Otvorí sa vám ďalšie okno, v ktorom môžete písať sled príkazov jazyka Python. Najprv si súbor uložte (Ctrl+S). Odporúčame, aby ste si vo vašom priečinku (C:\work\<login_do_ais>) vytvorili podpriečinok pre naše cvičenia. Do neho si uložte tento súbor. Po zvládnutí vytvorenia a uloženia súboru môžete spokojne pokračovať v písaní programov. Počas semestra nebudeme používať iné vývojové prostredie než IDLE (samozrejme, môžete tiež používať váš obľúbený textový editor alebo IDE). Ak chceme spustiť z prostredia IDLE náš skript, stlačíme tlačidlo F5 (alebo pomocou navigácie Run->Run Module).

Kto ešte v Pythone neprogramoval, nech si preštuduje kapitolu http://howto.py.cz/cap04.htm s názvom ‚Podmínky a funkce‘. Mali by ste (okrem iných) vypracovať úlohy 4–7 z Cvičení (časť 4.10).  Venujte tomu maximálne 30 minút, potom pokračujte vypracovaním nasledovného zadania (pomocou modulu ppds).

Implementujte dve vlákna, ktoré budú používať spoločný index do spoločného poľa (inicializovaného na hodnoty 0) istej veľkosti. Každé vlákno nech inkrementuje ten prvok poľa, kam práve ukazuje spoločný index. Následne nech index zvýši. Ak už index ukazuje mimo poľa, vlákno svoju činnosť skončí. Po skončení vlákien spočítajte, koľko prvkov poľa má hodnotu 1. Ak zistíte, že nie každý prvok poľa má hodnotu 1, modifikujte program tak, aby na koniec (po skončení behu vlákien) zistil početnosti (histogram) hodnôt, ktoré sa nachádzajú v poli. Pre zjednodušenie úlohy prikladáme nasledovné poznámky.

  1. Importujte modul ppds.
  2. Definujte zdieľaný objekt (triedu!) Shared, ktorý bude mať nasledovné atribúty (nastavujte ich v inicializačnej funkcii triedy):
    1. spoločné počítadlo counter
    2. veľkosť poľa end
    3. celočíselné pole elms o veľkosti end s vynulovanými prvkami
  3. Definujte funkciu, ktorá prijíma zdieľaný objekt shared. Túto funkciu budú vykonávať pracovné vlákna. Funkcia nech v nekonečnom cykle v každej iterácii:
    1. kontroluje, či shared.counter nie je mimo veľkosti poľa; ak áno, cyklus sa preruší a funkcia skončí
    2. zvýši (inkrementuje) hodnotu prvku zdieľaného poľa shared.elms na pozícii shared.counter
    3. zvýši (inkrementuje) hodnotu zdieľaného počítadla shared.counter
  4. Definujte telo samotného vykonania programu:
    1. vytvorte zdieľaný objekt shared o veľkosti poľa napríklad 1 000 000
    2. vytvorte pracovné vlákno a jeho identifikátor uložte
    3. vytvorte druhé pracovné vlákno a jeho identifikátor uložte
    4. počkajte na dokončenie práce oboch vytvorených vlákien
    5. spočítajte výskyty hodnôt a vypíšte ich na obrazovku
  5. Niekoľkokrát spustite program (aj s rôznou veľkosťou poľa) a analyzujte výstup.

Vytvorenie a čakanie na dokončenie behu vlákna pomocou modulu ppds, skelet programu:


Ak chceme opraviť program a použiť synchronizačný vzor ‚Mutual Exclusion‘, na implementáciu mutexu môžeme použiť triedu Mutex z modulu ppds. Ukážka použitia: