{{indexmenu_n>13}}
====== Lab 13 - Vícevláknové aplikace (Rezerva) ======
TBD - pro vyučující a výchozí soubory
/*
* Pro vyučující: [[courses:b3b36prg:internal:tutorialinstruction:13|]]
{{ :courses:b3b36prg:labs:prg-lab13-sources.zip |Výchozí soubory prg-lab13-sources.zip}}\\
{{ :courses:b3b36prg:lectures:b3b36prg-lec11-codes.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 [[courses:b3b36prg:lectures:start#vicevlaknove_programovani_modely_aplikaci_posix_vlakna_c11_vlakna|lec11]].
* 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);
...