Warning
This page is located in archive. Go to the latest version of this course pages. Go the latest version of this page.

9 - Vícevláknové aplikace

Procvičovaná témeta

  • 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.

courses/bab36prga/labs/lab09.txt · Last modified: 2021/02/06 18:20 by deckejin