{{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); ...