Programowanie współbieżne - Lista 3
Zadanie 1
Obejrzeć stronę manuala dla "getchar_unlocked" i "putchar_unlocked".
Napisać program kopiujący pliki znak po znaku przy pomocy "getchar"
i "putchar". Zrobić też wersję wielowątkową -- każdy wątek ma czytać
co potrafi z (wspólnego) pliku wejściowego i pisać do pliku wyjściowego.
Następnie zamienić w wersji jednowątkowej wywołania "getchar" i "putchar"
na "getchar_unlocked" i "putchar_unlocked".
Porównać działanie i szybkość.
Zadanie 2
Zagadnienie pięciu filozofów polega na tym że mamy 5 procesów
(filozofów) i 5 zasobów (widelce). Procesy na przemian są
aktywne (jedzą) lub nieaktywne (myślą). Proces N do
aktywności potrzebuje zasobu N i N+1 (gdzie dodawanie jest
modulo 5. Należy je zaprogramować
(być może wprowadzając dodatkowe procesy) tak by w danym momencie
tylko jeden proces korzystał z danego zasobu i by wszystkie
mogły się "poruszać do przodu" (przy założeniu że każdy
proces po skończonym okresie aktywności przejdzie na
pewien czas do stanu nieaktywnego).
Zaprogramować rozwiązanie zagadnienia pięciu filozofów bazując na
semaforach. Wypróbować naiwną (niepoprawną) wersję gdy proces
napierw blokuje semafor N a potem semafor N+1, potem wersję
gdy proces N stara się pozyskać zasoby w kolejności numerów
(ważny jest przypadek gdy N+1 mod 5 jest mniejsze od N).
Potem wersję gdy oba zasoby pozyskuje się w sekcji krytycznej,
przy tym jeśli zasób nie jest dostępny to proces ustawia
się w kolejce i blokuje na dodatkowym semaforze, a potem
jest budzony przez proces pomocniczy.