TD1: Explain and fix the deadlock in exo3.
authorJérôme Benoit <jerome.benoit@piment-noir.org>
Fri, 9 Mar 2018 09:16:17 +0000 (10:16 +0100)
committerJérôme Benoit <jerome.benoit@piment-noir.org>
Fri, 9 Mar 2018 09:16:17 +0000 (10:16 +0100)
Signed-off-by: Jérôme Benoit <jerome.benoit@piment-noir.org>
TD1/exo3/BufferCirc.java
TD1/exo3/Main.java
TD1/exo3/deadlock.txt [new file with mode: 0644]

index 68f1f1f9fd922c1eab10fcf1d1f52a336156c605..ebfb2877016fdc978bf4e47b6d61ba9b9e2cb6c3 100644 (file)
@@ -43,7 +43,7 @@ public class BufferCirc {
                tampon[prem] = obj;\r
                prem = (prem + 1) % taille;\r
                //System.out.println(Thread.currentThread().getName() + " a depose " + (Integer)obj);\r
-               notify();\r
+               notifyAll();\r
        }\r
 \r
 \r
@@ -61,7 +61,7 @@ public class BufferCirc {
                outObj = tampon[der];\r
                der = (der + 1) % taille;\r
                //System.out.println(Thread.currentThread().getName() + " a preleve " + (Integer)outObj);\r
-               notify();\r
+               notifyAll();\r
                return outObj;\r
        }\r
 \r
index 1d65a13a9c7c79c173936f60fbcf59e0a65b2723..78c3b030fa691f8df3b2bff28acdf4257b76d01c 100644 (file)
@@ -7,8 +7,8 @@ public class Main {
 \r
        public static void main (String[] args) {\r
                final int BUFFER_SIZE = 1;\r
-               final int PROD_NUMBER = 10;\r
-               final int CONS_NUMBER = 10;\r
+               final int PROD_NUMBER = 20;\r
+               final int CONS_NUMBER = 20;\r
                BufferCirc b = new BufferCirc(BUFFER_SIZE);\r
                Thread[] P = new Thread[PROD_NUMBER];\r
                Thread[] C = new Thread[CONS_NUMBER];\r
diff --git a/TD1/exo3/deadlock.txt b/TD1/exo3/deadlock.txt
new file mode 100644 (file)
index 0000000..c926496
--- /dev/null
@@ -0,0 +1,13 @@
+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.
+             -> 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)