Aplikace, která spustí n vláken, z nichž některé budou pokladní, jiné pekařky a jiné zákazníci. Zákazníci náhodně nakupují od pekařek zboží a náhodně chodí platit. V daném okamžiku může jak pekařka tak i pokladní obsluhovat vždy pouze jednoho zákazníka. Pekařky náhodně generují nové pečivo, zakazníci si generují nové peníze. Pokladní negenerují nic, pouze příjímají platby. Počet vláken se během běhu aplikace může měnit, tj. v okamžiku kdy pekařka vygeneruje 1000 zboží se sama ukončí, hlavní proces může dodatečně náhodně spustit vlákno libovolného typu. Aplikace končí po provedení určitého počtu nákupů či na interaktivní žádost uživatele. Následně by se měla vypsat statistika, kolik zboží bylo vygenerováno a kolik ho bylo nakoupeno.
Úlohu jsem zrealizoval nasledně. Vytvořím tolik vlaken kolik je aktérů v obchodu, tzn. že máme 3 typy vláken (pokladní, pekařka, zákazník). Pekařky a zákazníky ukládám do front (realizovaných pomocí cyklických spojových seznamů a ukazatelů na aktuální záznam - akt_zakazník a akt_pekarka). Každé vlákno má v sobě cyklus, kde na začátku je inicializace, pak následuje nekonečný cyklus zpomalený o (TIME_KOEF*(TIME_pokladni, TIME_pekarka, TIME_zakaznik) a s podmínkou ukončení vlákna:
Program jsem implementoval v jazyce C na svém serveru s OS Linux, Debian a jádrem 2.4.20. Překlad zdrojového kódu jsem dělal pomocí programu gcc s přepínači '-Wall -g dohnaj1.c -o dohnaj1 -lpthread'.
Zadání úlohy se mi podařilo splnit. Problém synchornizace přístupu jednotlivých vláken do sdílených proměnných jsem pochopil a zvládl implementovat. Případná zlepšení by mohla být např. v průběžných výpisech, nebo zadávání parametrů obchodu z příkazové řádky. Úloha je implementována pokud možno co nejjednodušeji.
Při implementaci jsem využíval hlavně manuálových stránek systému Linux, Debian a dokumentace ze stránek předmětu OSY.