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.