{{indexmenu_n>11}}
====== Lab 11 - Vícevláknové aplikace ======
* Pro vyučující: [[courses:bab36prga:internal:tutorialinstruction:11|]]
/* * [[https://docs.google.com/presentation/d/1HBgUYFCPfGIcYmHjLGuv74sXHcbvkpbi0NkpThGVVVE/edit?usp=sharing|Prezentace pro cvičení ]] */
{{ :courses:bab36prga:labs:lab11-sources.zip |Výchozí soubory lab11-sources.zip}}
===== Procvičovaná téma =====
* Opakování vláken (pthread)
* Implemetace vícevláknové aplikace
Cílem cvičení je implementovat program s třemi paralelně běžícími vlákny. První vlákno je určeno pro zpracování vstupu (čtení stiknuté klávesy), druhé vlákno aktualizuje výstup (jednořádkový) a třetí vlákno implementuje časovač, který po uplynutí definované periody zvýší hodnotu proměnné (čítače). Perioda může být nastavována uživatelem, stiskem definovaných kláves. Použití vláken je založeno na knihovně ''pthread'' (POSIX threads) a příklad demonstruje použití základních konstrukcí ''pthread'' knihovny.
===== Úkoly =====
* Použijte bloky z minulého cvičení pro vytvoření aplikace se třemi vlákny. Ve skutečnosti bude mít aplikace vlákna 4, včetně hlavního vlákna ''main()'' funkce
* Pro čtení kláves bez nutnosti potvrzovat ''Enter'' přepněte terminál do ''raw'' režimu, například tak jak bylo prezentována v přednášce lec08
* Použijte strukturu pro zapouzdření proměnných sdílených jednotlivými vlákny
* Použijte kritickou sekci (mutex) pro přístup ke sdíleným datům
* Použijte zasílání signálů pro komunikaci mezi vlákny a zabránění plýtvání výpočetním výkonem
* Přidejte jméno (textový řetězec) identifikující každé vlákno: "Input", "Output", and "Alarm"
* "Alarm" vlákno inkrementálně zvyšuje hodnotu čítače po uplynutí definové periody
* Použijte pole a datové struktury, které umožní zautomatizovat správu vláken v cyklech
* Program bude reagovat na následující stisk kláves
* 'q' - ukončí program tak, že všechna vlákna budou korektně ukončena, tj. vyskočí z příslušných cyklech hlavního těla vlákna
* 'r' - sníží periodu pro inkrementaci čítače o 10 ms
* 'p' - zvýší periodu pro inkrementaci čítače o 10 ms
* Minimální hodnota periody je 10 ms
* Maximální hodnota periody je 2000 ms
* Výstup programu je jeden řádek ve tvaru "\rAlarm period: %10i Alarm counter: %10i"
==== Tipy ====
* Jelikož výstupní řádek není zakončen koncem řádku může být nutné explicitně vynutit výstup voláním ''flush'' na ''stdout'' ve výstupním vlákně, např. jako fflush(stdout);
* Vytvořte novou globální proměnnou ''quit'' k indikaci, že program bude ukončen jakmile uživatel stiskne klávesu ''Enter'' např.
bool quit = false;
...
gechar();
pthread_mutex_lock(&mtx);
quit = true;
pthread_mutex_unlock(&mtx);
...
===== Další úkoly na cvičení =====
V další části cvičení pokračujte implementací domácího úkolu HW08.