Zadaniem będzie napisanie programu wielowątkowego do przetwarzania i wyświetlania obrazów.

Program główny najpierw uruchomi podproces wyświetlający obrazki pobierane z pliku zmapowanego do pamięci, podobnie jak w poprzednim zadaniu. Następnie program uruchomi kilka wątków, których zadaniem będzie przetwarzanie obrazków określonym algorytmem filtracji (każdy wątek będzie realizował inny filtr, patrz niżej). Potem wątek główny będzie interakcyjnie pobierał od użytkownika nazwy plików kolejnych obrazków, wczytywał je do pamięci, i zgłaszał gotowość kolejnego obrazka, co dla wszystkich wątków będzie sygnałem do porzucenia bieżących obliczeń i rozpoczęcia obróbki nowego obrazka.

Wątki filtrujące będą operowały na swoich własnych kopiach obrazka. Po zakończeniu filtracji każdy wątek zgłosi gotowość swojej przefiltrowanej wersji obrazka, i po otrzymaniu potwierdzenia przekopiuje swój obrazek do globalnego obszaru pamięci zmapowanej do pliku. Wątki filtrujące muszą być cały czas gotowe do przerwania aktualnie wykonywanej pracy i rozpoczęcia jej od nowa na innym obrazku.

Dodatkowym wątkiem programu będzie wątek nadzorujący, który zapewni, że kolejno zgłoszone jako przefiltrowane wersje obrazka będą w tej kolejności wyświetlane przez uruchomiony w podprocesie program wyświetlający (display), każdy przez określoną liczbę sekund. Czas wyświetlania każdej wersji będzie zadany argumentem wywołania programu (domyślnie 5 sekund). Wątek nadzorujący również musi zareagować na wczytanie nowego obrazka przez wątek główny, i rozpocząć procedurę sterowania jego wyświetlaniem.

Program powinien wyświetlać informację o tym, w jakiej kolejności wątki zakończyły filtrowanie obrazka, i ile czasu trwały obliczenia wszystkich filtrów.

Uwagi na temat przetwarzania obrazów. Do jego zaimplementowania można wykorzystać bibliotekę graficzną taką jak OpenCV, Image Magick, albo netpbm. Wtedy zarówno wczytywanie, filtrowanie, jak i zapis przetworzonego obrazka w formacie do wyświetlania można wykonać w całości gotowymi funkcjami biblioteki. Trzeba jednak zapoznać się z daną biblioteką w stopniu wystarczającym do jej użycia.

W przypadku użycia tego typu biblioteki zaleca się użycie większej liczby procedur filtrujących w celu zapoznania się z nimi.

Alternatywnym podejściem jest napisanie wszystkiego samodzielnie. W takim przypadku proponowane jest wykorzystanie tylko plików w formacie PNM (jest to podstawowy format biblioteki PNM) i implementację filtracji w postaci konwolucji. W ten sposób jednym prostym algorytmem można zrealizować kilka ciekawych filtracji, np. filtr Sobela, wykrywanie krawędzi, różne rodzaje wygładzania, itp. (patrz np. przykłady na stronie http://wally.cs.iupui.edu/n351/raster/filterDemo.html).