1. (1p.) Wstęp. Utwórz, skompiluj i uruchom program "Hello world"
    1. Napisz prosty program wykorzystujący Pthreads, który:
      • Dołącza plik nagłówkowy pthread.h
      • Główny program tworzy kilka wątków, z których każdy wykonuje procedurę „print hello”. Przekazywany do procedury argument to ID wątku.
      • Procedura „print hello” wyświetla „hello world from thread ID” (gdzie ID jest identyfikatorem wątku), a następnie wywołuje pthread_exit aby zakończyć wątek.
      • Główny program wywołuje pthread_exit jako ostatnią czynność.
    2. Używając wybranego kompilatora, skompiluj swój program. Może to wymagać kilku prób, jeśli wystąpią błędy. Przykładowo:
      cc -o hello myhello.c -lpthread
      gcc -o hello myhello.c -pthread
      Gdy kod skompiluje się bez ostrzeżeń, przejdź do następnego punktu.
    3. Uruchom swój program hello i zwróć uwagę na jego wyjście. Czy jest to tym, czego oczekiwałeś? Dla porównania, możesz skompilować i uruchomić dołączony przykładowy program hello.c.

  2. (1p.) Tworzenie wątków
    1. Przejrzyj kod programu hello32.c. Zwróć uwagę, że tworzy on 32 wątki. Polecenie sleep() zostało wprowadzone, aby upewnić się, że wszystkie wątki będą istnieć w tym samym czasie. Dodatkowo, każdy wątek wykonuje prawdziwą pracę, aby zademonstrować jak zachowanie planisty systemu operacyjnego determinuje kolejność wykonywania wątków.
    2. Skompiluj i uruchom program (jeśli używasz gcc, dołącz flagę -lm). Zwróć uwagę na kolejność w której wyświetlane są wyjścia wątków. Czy zawsze jest taka sama? Jakie jest tego wyjaśnienie?

  3. (2p.) Przekazywanie argumentów
    1. Przejrzyj kod programów hello_arg1.c oraz hello_arg2.c. Zauważ w jaki sposób do wątku przekazywany jest pojedynczy argument, oraz jak przekazać wiele argumentów przez strukturę.
    2. Skompiluj oraz uruchom oba programy i obserwuj wyjście.
    3. Teraz przejrzyj, skompiluj i uruchom program bug3.c. Co poszło nie tak? Jak to naprawić?

  4. (2p.) Kończenie wątków
    1. Przejrzyj, skompiluj (jeśli używasz gcc, dołącz flagę -lm) i uruchom program bug5.c.
    2. Co się dzieje? Dlaczego? Jak to naprawić?

  5. (2p.) Czekanie na zakończenie wątku
    1. Przejrzyj, skompiluj (jeśli używasz gcc, dołącz flagę -lm) i uruchom program join.c.
    2. Zmodyfikuj program tak, aby wątki zwracały różne wartości. Skompiluj i uruchom. Działa?
    3. Dla porównania, przejrzyj, skompiluj i uruchom program przykładowy detached.c.
    4. Obserwuj zachowanie i zauważ, że w przykładzie nie ma instrukcji join.
    5. Wyjaśnij różnicę między tymi dwoma programami.

  6. (2p.) Operacje ze stosem
    1. Przejrzyj, skompiluj i uruchom program bug2.c.
    2. Co się dzieje? Dlaczego? Jak to naprawić?
    3. Dla porównania uruchom program bug2fix.c.