Synchronizacja wątków i tworzenie programów równoległych

Przygotowanie do wykonania zadania

Przypomnij sobie wiadomości o programowaniu wątków z wykorzystaniem biblioteki Pthread. W szczególności zapoznaj się z dokumentacją funkcji:

Przypomnij sobie również czym jest sekcja krytyczna, do czego służy muteks i semafor. Następnie zapoznaj się z dokumentacją funkcji:

Zadania do wykonania

Zad.1. (1 punkt - na zajęciach) Operacje ze stosem

Zad.2. (3 punkty - na zajęciach) Zmienne warunkowe

(a) Przejrzyj, skompiluj i uruchom program condvar.c. Obserwuj wyjścia trzech wątków.

(b) Teraz przejrzyj, skompiluj i uruchom program bug1.c. Obserwuj wyjścia pięciu wątków. Co się dzieje? Czy potrafisz wyjaśnić dlaczego? Jak naprawić problem?

(c) Program bug4.c to kolejny przykład tego, co może pójść źle przy użyciu zmiennych warunkowych. Przejrzyj go, skompiluj i uruchom. Zaobserwuj wyjście i spróbuj naprawić program.

Zad.3. (6 punktów - na zajęciach, lub 3 punkty - w domu)

Książe Dipontelini zmarł podczas polowania na jelenie w pobliskim lasku. Książe miał wielu synów (N) - bardzo zachłannych młodzieńców. Jego włości stanowią X * Y działek, na których znajdują się cenne zasoby, zwierzyna, wioski oraz zamki. Każdy z synów pragnie zawładnąć największą liczbą terenów. Rejent Sir Vivaldini ma niemałą zagwostkę jak pogodzić zwaśnionych synów.

Stwórz symulację tej sytuacji zachowując następujące zasady:

Przetestuj rozwiązanie na różnych zestawach danych N, X, Y oraz S.
Dla sensownego testowania te wartości powinny spełniać warunek N*S==X*Y (ale w programie nie można nic takiego zakładać).
W raporcie podaj przykładowe wyniki dla trzech wybranych zestawów danych.

UWAGA: do wygenerowania wartości losowej można wykorzystać funkcję drand48(), która ma lepsze własności niż podstawowa funkcja rand(). Przed użyciem każdej z tych funkcji konieczne jest zainicjowanie generatora liczb losowych wartością przypadkową, tzw. ziarnem. Jako wartości przypadkowej można użyć aktualnego czasu w sekundach (time()), numeru bieżącego procesu (getpid()), lub kombinacji tych wartości, albo jeszcze jakiejś innej funkcji.