X-Git-Url: https://git.piment-noir.org/?p=TD_SR.git;a=blobdiff_plain;f=TD1%2Fexo3%2Fdeadlock.txt;h=0aa206a80ead45ad790e0498a0fb747e8d5eba68;hp=1dcd56943aa5cfa776549d26804a6a018d9b3462;hb=f734b9878de62b987da4922fa796a691d16680ce;hpb=c87306af42c468a61b0e39c3464b2dbe4d3f08d9 diff --git a/TD1/exo3/deadlock.txt b/TD1/exo3/deadlock.txt index 1dcd569..0aa206a 100644 --- a/TD1/exo3/deadlock.txt +++ b/TD1/exo3/deadlock.txt @@ -1,13 +1,19 @@ -Trace deadlock avec deux consommateurs, deux producteurs et un tampon de taille 1. +Pseudo-trace deadlock avec deux consommateurs, deux producteurs et un tampon de taille 1. +----------------------------------------------------------------------------------------- -Buffer vide -> C1 et C2 sont en attente (suspendus). - -> P1 rentre en section critique, depose et notifie un thread, mettons P2 -Buffer plein -> P1 se met en attente, P2 a été notifié mais le buffer est plein, donc - P2 en attente. - -> donc C1, C2, P1, P2 sont en attente - et aucune notification ne sera faite pour les réveiller. +Buffer vide -> C1 et C2 se mettent en attente dans la file (C1, C2). + -> P1 rentre en section critique et P2 se met en attente soit (P2, C1, C2). + P1 depose et notifie a un thread en attente. Le dernier en attente est P2 donc P2 est notifié. +Buffer plein -> P2 sort de la file d'attente (C1, C2) et entre en SC, P1 se met en attente (P1, C1, C2). + Or le buffer est plein, donc P2 se met en attente dans la file (P2, P1, C1, C2). + -> donc C1, C2, P1, P2 sont en attente dans la file (P2, P1, C1, C2) + et aucune notification ne sera faite pour les sortir de la file. -> deadlock. Solution: faire un notifyAll() en sortie de SC dans le buffer pour s'assurer que un - thread d'un type différent du type courant sortant du moniteur est notifié - (Consommateur -> Producteur ou Producteur -> Consommateur) et sort de son attente. + thread d'un type différent du type courant sortant du moniteur est également notifié + (Consommateur -> Producteur ou Producteur -> Consommateur) et sort de son attente. + +N.B. : On suppose dans la mise en attente dans moniteur des threads est une file. + Mais même si c'est une autre structure de données, la possibilité de deadlock + demeure.