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.
Můžeme využít výchozí soubor main.c ve kterém máme připraveny funkce pro tři různá vlákna:
input_thread() je vlákno zpracování vstupu (čtení stiknuté klávesy);
output_thread() je vlákno aktualizující výstup (jednořádkový);
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.
main() funkce.
"\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.
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.
flush na stdout ve výstupním vlákně, např. jako fflush(stdout);
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); ...
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.
mpa-alrm → mpa-ctrl)
mpa-alrm ← mpa-ctrl)
mpa-alrm ← mpa-ctrl)
mpa-alrm ← mpa-ctrl)
mpa-alrm ← mpa-ctrl)
mpa-alrm → mpa-ctrl)
mpa-alrm ← mpa-ctrl)
Program mpa-ctrl reaguje je na stisk kláves 'e', 'd', 'p', 'r' definované komunikace. Dále reaguje na
Pojmenované roury mohou být například
/tmp/mpa-alrm.in (komunikace mpa-alrm ← mpa-ctrl) a /tmp/map-ctrl.in mpa-alrm → mpa-ctrl).
V obou programech použijeme neblokující čtení/zápis z/do souboru prostřednictvím knihovny prg_io_nonblock.c.
thread_barrier.c).
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.