From 7bd74736638acf238b5bcb2ae51e05519ad116ae Mon Sep 17 00:00:00 2001 From: =?utf8?q?J=C3=A9r=C3=B4me=20Benoit?= Date: Fri, 9 Mar 2018 10:16:17 +0100 Subject: [PATCH] TD1: Explain and fix the deadlock in exo3. MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit Signed-off-by: Jérôme Benoit --- TD1/exo3/BufferCirc.java | 4 ++-- TD1/exo3/Main.java | 4 ++-- TD1/exo3/deadlock.txt | 13 +++++++++++++ 3 files changed, 17 insertions(+), 4 deletions(-) create mode 100644 TD1/exo3/deadlock.txt diff --git a/TD1/exo3/BufferCirc.java b/TD1/exo3/BufferCirc.java index 68f1f1f..ebfb287 100644 --- a/TD1/exo3/BufferCirc.java +++ b/TD1/exo3/BufferCirc.java @@ -43,7 +43,7 @@ public class BufferCirc { tampon[prem] = obj; prem = (prem + 1) % taille; //System.out.println(Thread.currentThread().getName() + " a depose " + (Integer)obj); - notify(); + notifyAll(); } @@ -61,7 +61,7 @@ public class BufferCirc { outObj = tampon[der]; der = (der + 1) % taille; //System.out.println(Thread.currentThread().getName() + " a preleve " + (Integer)outObj); - notify(); + notifyAll(); return outObj; } diff --git a/TD1/exo3/Main.java b/TD1/exo3/Main.java index 1d65a13..78c3b03 100644 --- a/TD1/exo3/Main.java +++ b/TD1/exo3/Main.java @@ -7,8 +7,8 @@ public class Main { public static void main (String[] args) { final int BUFFER_SIZE = 1; - final int PROD_NUMBER = 10; - final int CONS_NUMBER = 10; + final int PROD_NUMBER = 20; + final int CONS_NUMBER = 20; BufferCirc b = new BufferCirc(BUFFER_SIZE); Thread[] P = new Thread[PROD_NUMBER]; Thread[] C = new Thread[CONS_NUMBER]; diff --git a/TD1/exo3/deadlock.txt b/TD1/exo3/deadlock.txt new file mode 100644 index 0000000..c926496 --- /dev/null +++ b/TD1/exo3/deadlock.txt @@ -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) -- 2.34.1