semafory - co to deadlock/zakleszczenie

0

W zespole programistów pracujących nad współbieżnym kodem ustalono, że dostęp do współdzielonej zmiennej całkowitej z1(typu int)
chroniony będzize semaforem s1, a do zmiennej z2 (również typu int) - semaforem s2.
W wyniku niezależnej pracy dwóch programistów powstały w różnych miejscach kodu przestawione poniżej sekwencje operacji.
Proszę wyjaśnić na czym polega błąd w kodzie i jak można by go usunąć.

//------------------ PIERWSZY KOD ----
P(s1);
P(s2);
z1 = z2++;
V(s1);
V(s2);
//-----------------

//--------DRUGI KOD -----
P(s2);
P(s1);
z2 = z1++;
V(s2);
V(S1);
//-------

Ma ktoś pomysł na rozwiązanie ? Drugie pytanie, jak robicie kolorowanie składni ?

2

Jak jeden zajmie S1, a drugi zajmie S2 to przecież dalej już żaden nie pójdzie. Trzeba ustalić wspólną kolejność zajmowania semaforów.
Swoją drogą to wygląda jak pierwszy przykład z ćwiczeń z semaforów, a nie ciekawe zadanie ;)

1

Odpowiadam na pytanie zadane w temacie.
Wyobraź sobie, że dwie osoby zbliżają się do drzwi. Ale osoby są grube, a drzwi są małe, więc jednocześnie może przejść przez nie tylko jedna osoba. Te dwie osoby są bardzo kulturalne i chcą się przepuścić nawzajem. Jaki mamy rezultat?

  • Pan idzie pierwszy
  • Ale w żadnym wypadku, proszę bardzo, Pan pierwszy
  • Ależ nie, ja pójdę za Panem
  • Oj nie ma mowy, proszę iść pierwszy

i tak aż do śmierci. To jest zakleszczenie. Semafor A, czeka aż zwolni się (przejdzie przez drzwi) semafor B, a semafor B w tym samym czasie czeka na zwolnienie (przejście) semafora A. I program jest zakleszczony - zawiesza się na wieki wieków.

Aby uniknąć zakleszczenia, trzeba tak sterować semaforami, żeby nie dopuścić do sytuacji, w której jeden semafor czeka na drugi. Czyli w podanym przykładzie - ujednolicić kolejność, jak już stwierdził przedmówca.

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