Treść #
Należy napisać program symulujący wyścig psów. Program przyjmuje dwa
argumenty, liczby naturalne: n>20
— długość toru oraz m>2
— liczbę
psów. Główny wątek programu tworzy tor wyścigowy dla psów — tablicę
intów o długości n
. Tablica początkowo jest wypełniona zerami. Tablica
będzie przechowywać liczbę psów znajdujących się w danym miejscu na
torze. Po zainicjowaniu tablicy program tworzy m
wątków, każdy wątek
reprezentuje jednego psa.
Wątek psa działa w następujący sposób: początkowo pies znajduje się poza torem, na początku wątek umieszcza psa na pozycji 0 i zwiększa wartość tablicy o 1. Kierunek przemieszczania się psa to rosnące indeksy tablicy. Potem, w pętli wykonuje następujące akcje:
- Czeka losowy czas z przedziału
[200, 1520]
ms - Losuje liczbę całkowitą z przedziału
[1,5]
– odległość, o którą się przemieści. - Sprawdza, czy wylosowana pozycja jest w zakresie tablicy. Jeśli nie, to przemieszcza się tak daleko, jak się da, po czym zmienia kierunek przemieszczania.
- Sprawdza, czy na pozycji, na którą się przeniósł, znajduje się inny
pies. W takiej sytuacji wypisuje komunikat
waf waf waf
i pozostaje na swoim miejscu. - Wypisuje na stdout swój numer i nową pozycję i ew. informacje o dotarciu do końca toru
- Aktualizuje odpowiednio wartości w tablicy (zmniejsza wartość na pozycji, którą opuszcza i zwiększa na pozycji, do której przybywa).
Po dobiegnięciu do końca tablicy pies wypisuje, który w kolejności przybył do mety i kończy swoją pracę.
Główny wątek co 1000 ms wypisuje stan tablicy. Gdy każdy pies skończy
wyścig, program powinien wypisać trzy najszybsze psy i się zakończyć. W
reakcji na sygnał SIGINT
główny wątek anuluje wszystkie wątki psów,
czeka na ich zakończenie, po czym program się kończy wypisując
informacje o przerwanych zawodach.
Dostęp do tablicy należy blokować odrębnym mutexem na każdy element. Licznik psów, które dotarły do mety także powinien być blokowany mutexem.
W programie nie można używać żadnych zmiennych globalnych.
Oceniane etapy #
- Odczytać argumenty, zainicjować tablicę. Utworzyć wątki psów. Każdy wątek zwiększa o 1 losową komórkę tablicy, wypisuje jej numer i się kończy. Po zakończeniu wszystkich wątków psów wątek główny wypisuje końcowy stan toru.
- Działa logika wątku psa, na razie bez blokowania.
- Działa blokowanie z użyciem mutexów.
- Działa kończenie programu z użyciem
SIGINT
.