Code cleanups.
[TD_SR.git] / TD1 / exo3 / deadlock.txt
CommitLineData
f734b987
JB
1Pseudo-trace deadlock avec deux consommateurs, deux producteurs et un tampon de taille 1.
2-----------------------------------------------------------------------------------------
7bd74736 3
f734b987
JB
4Buffer vide -> C1 et C2 se mettent en attente dans la file (C1, C2).
5 -> P1 rentre en section critique et P2 se met en attente soit (P2, C1, C2).
98a1366c
JB
6 P1 depose et notifie a un unique thread en attente.
7 Le dernier en attente est P2 donc P2 est notifié.
f734b987
JB
8Buffer plein -> P2 sort de la file d'attente (C1, C2) et entre en SC, P1 se met en attente (P1, C1, C2).
9 Or le buffer est plein, donc P2 se met en attente dans la file (P2, P1, C1, C2).
10 -> donc C1, C2, P1, P2 sont en attente dans la file (P2, P1, C1, C2)
11 et aucune notification ne sera faite pour les sortir de la file.
7bd74736
JB
12 -> deadlock.
13
14Solution: faire un notifyAll() en sortie de SC dans le buffer pour s'assurer que un
f734b987
JB
15 thread d'un type différent du type courant sortant du moniteur est également notifié
16 (Consommateur -> Producteur ou Producteur -> Consommateur) et sort de son attente.
17
367e2930 18N.B. : On suppose que la mise en attente des threads dans le moniteur est une file.
f734b987
JB
19 Mais même si c'est une autre structure de données, la possibilité de deadlock
20 demeure.