Lab 12 - Vícevláknové aplikace

Procvičovaná téma

  • Opakování vláken (pthread)
  • Implemetace vícevláknové aplikace
  • Implementace vícevláknové aplikace s meziprocesovou komunikací MPA.

Cílem cvičení je implementovat program s více paralelně běžícími vlákny z přednášky lec11 a následně jej rozšířit do programu ovládající jinou aplikaci prostřednictvím komunikace pojmenovanou rourou, viz Lab 10 - Meziprocesová komunikace.

Implemetace vícevláknové aplikace

Můžeme využít výchozí soubor main.c ve kterém máme připraveny funkce pro tři různá vlákna:

  1. input_thread() je vlákno zpracování vstupu (čtení stiknuté klávesy);
  2. output_thread() je vlákno aktualizující výstup (jednořádkový);
  3. alarm_thread() je vlákno časovače, který po uplynutí definované periody zvýší hodnotu proměnné (čítače).

Perioda časovače 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.

Úkol na cvičení je implementace aplikace z přednášky lec11, kterou lze přímo použít. Nicméně postupná a samostatná implementace umožní pochopit principy.

Ú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.
  • 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, například pole.
  • 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"

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

Například funkce call_termios()

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.

Např. ve výstupním vlákně

Nebo ve vlákně alarm_thread() při počátační incializaci lokálních proměnných

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. Fakticky je nutné překreslit výstup ve vlákně (funkci) output_thread() pouze pokud došlo k nějaké změně, uživatelský vstup nebo zvýšení hodnoty čítače.

Například ve vlákně alarm_thread()

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;
   ...
   getchar();
   pthread_mutex_lock(&mtx);
   quit = true;
   pthread_mutex_unlock(&mtx);
   ...

Implemetace multiprocesové vícevláknové aplikace MPA

V další části cvičení pokračujte směrem k implementaci vícevláknová aplikace s meziprocesovou komunikací, realizovanou pojmenovanou rourou (vizte Lab 10). Program “rozdělte” na dva programy.

  • mpa-alrm je program realizující vzdálený časovač.
  • mpa-ctrl je program ovládající vzdálený časovače, od kterého přijímá informace o uplynutí času.

Budeme uvažovat následující jednobajtovou komunikaci.

  • 'i' Může vyslat po startu, žádná reakce není očekávána. (mpa-alrmmpa-ctrl)
  • 'e' Spuštění časovače (enable). (mpa-alrmmpa-ctrl)
  • 'd' Zastavení časovače (disable). (mpa-alrmmpa-ctrl)
  • 'p' Zvýšení periody časovače o 10 ms (mpa-alrmmpa-ctrl)
  • 'r' Snížení periody časovače o 10 ms (mpa-alrmmpa-ctrl)
  • 'x' Indikace uplynutí doby časovače (mpa-alrmmpa-ctrl)
  • 'b' Indikace ukončení činnosti, program končí. (mpa-alrmmpa-ctrl)

Program mpa-ctrl reaguje je na stisk kláves 'e', 'd', 'p', 'r' definované komunikace. Dále reaguje na

  • 'q' zasláním 'b' časovači a ukončením své činnosti.

Pojmenované roury mohou být například

  • /tmp/mpa-alrm.in (komunikace mpa-alrmmpa-ctrl) a
  • /tmp/map-ctrl.in mpa-alrmmpa-ctrl).

Vytvoření pojmenovaných rour

V obou programech použijeme neblokující čtení/zápis z/do souboru prostřednictvím knihovny prg_io_nonblock.c.

Další úkoly

  • Využijte tzv. barieru pro synchronizaci vláken po startu (thread_barrier.c).
  • Program mpa-ctrl rozšiřte o odhad akutálně nastavené period v aplikace mpa-alrm. To lze realizovat výpočtem průměrem za nějaký definovaný interval, např. v samostatném vlákně s periodickým výpočtem za 5 sekund.
courses/bab36prga/labs/lab12.txt · Last modified: 2025/02/16 09:21 by faiglj