Semestrální úloha 36OSY 2005

Téma úlohy: Simulace obchodu
Vypracoval: Jan Dohnal

3. ročník, obor Výpočetní technika, K336 FEL ČVUT,
Karlovo nám. 13, 121 35 Praha 2

Zadání

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.

Návrh a popis implementace

Ú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:

Pokud vlákno končí, vymaže se ze seznamu (s vyjímkou prodavaček), jinak provede svou funkci: Když se dokončí všechna vlákna skončí i hlavní a vypíše statistiku prodeje pečiva. Synchronizaci přístupu vláken do sdílených proměnných jsem zajistil pomocí MuTexu (3 semafory: zákazníci, pekařky a statistika). Hlavní vlákno čeka na dokončení všech ostatních pomocí funkce pthread_join.

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

Závěr

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.

Literatura

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.

Ke stažení

  • komplet v TAR a GZipu
  • náhled výstupu
  • zdrojový kód