Problem orangutanów - synchronizacja wątków

0

Witam! mam napisać program rozwiązujący problem synchronizacji za pomocą semaforów, a zadanie brzmi:

Nad głębokim kanionem, gdzieś w Ameryce Południowej, rozpięta jest lina. Używają jej orangutany by przekroczyć kanion. Lina wytrzymuje ciężar pięciu małp a dwa orangutany nie mogą jednocześnie przechodzić po niej z przeciwnych stron kanionu. Po wejściu na linę nie można zawrócić z drogi. Każda małpa oczekująca na przejście musi kiedyś zostać obsłużona.

Wiem że zadanie jest podobne do problemu czytelników i pisarzy w wersji bez priorytetów ale nie mogę nigdzie znaleźć tego algorytmu. Pewnie można to rozwiązać za pomocą kolejki FIFO, ale jak to konkretnie napisać?

4

Skąd wziąłeś to zadanie? Orangutany żyją w południowo-wschodniej Azji.

1

Tak to jest zmodyfikowany problem czytelników i pisarzy. Tyle że czytelnikami są orangutany przemieszczające się z punktu A do B a pisarze to orangutany przemieszczające się punktu B do A. Jeszcze jedna różnica jest taka, że pisarzy przebywających w czytelni może być wiele. Tak więc kilka małych modyfikacji do programu z http://putwiki.informatyka.org/wiki/Problem_czytelnik%C3%B3w_i_pisarzy

[code]
Semaphore mutexAB = 1;
Semaphore mutexBA = 1;
Semaphore site = 1;
Semaphore lineCapacity = N;
unsigned int countOrangutanAB = 0;
unsigned int countOrangutanBA = 0;

void OrangutanBA() {
while (true) {
OtherComputing();
P(lineCapacity);
P(mutexBA);
countOrangutanBA = countOrangutanBA +1;
if (countOrangutanBA == 1)
P(site);
V(mutexBA);
/* sekcja krytyczna /
access(resource);
/
koniec sekcji krytycznej */
P(mutexBA);
countOrangutanBA = countOrangutanBA -1;
if (countOrangutanBA == 0)
V(site);
V(mutexBA);
V(lineCapacity);
}
}

void OrangutanAB() {
while (true) {
OtherComputing();
P(lineCapacity);
P(mutexAB);
countOrangutanAB = countOrangutanAB +1;
if (countOrangutanAB == 1)
P(site);
V(mutexAB);
/* sekcja krytyczna /
access(resource);
/
koniec sekcji krytycznej */
P(mutexAB);
countOrangutanAB = countOrangutanAB -1;
if (countOrangutanAB == 0)
V(site);
V(mutexAB);
V(lineCapacity);
}
}
}
[/code]
Jeszcze trzeba zrobić tak aby orangutan AB po przejściu zmieniał się w orangutana BA i odwrotnie i pomyśleć czy taki kod może doporowadzić do zagłodzenia którejś ze stron :]

1 użytkowników online, w tym zalogowanych: 0, gości: 1