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
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
\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
--- /dev/null
+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)