Programmation Concurrente (2016)

TD Questions 9 et 10

Voir le sujet précédent Voir le sujet suivant Aller en bas

TD Questions 9 et 10

Message par pc15 le Dim Oct 02, 2016 4:52 pm

Bonjour,

Les question 9 et 10 n'ayant pas été traité en TD, je fais appel à votre aide.

Pour augmenter le parallélisme, j'ai modifié le nombre d'éléments du buffer en exclusion mutuelle tout en stockant ce nombre dans une variable local. Ainsi, les producteurs ne pourrons pas écrire dans la même case.

Voici mon code :

Code:

int i;
 synchronized(ob1)
 {
 while(nbElements==tab.length)
 {
 System.out.println("Le producteur "+id+ " attend dans la file ");
 wait();
 
 }
 i=++nbElements;
 }
 
 
 tab[i-1]=val;
 
 
 System.out.println("Le producteur "+id+" dépose : "+val+" a la case "+ (i-1));




Cependant, je ne trouve pas le moyen de permettre à deux écrivains d'écrire en parallèle tout en empêchant un consommateur d'accéder à une case en cours d'écriture. J'ai pensé à créer un tableau d'objets verrous de même taille que la taille du buffer pour avoir l'accès à chaque case en exclusion mutuelle.

Voici le code de la fonction depot

Code:
public void depot(int val, int id, int numdep) throws InterruptedException
 {
 int i;
 synchronized(ob1)
 {
 
 while(nbElements==tab.length)
 {
 System.out.println("Le producteur "+id+ " attend dans la file et nbElements = "+nbElements+ " et la taille du tableau : "+tab.length+" depot : "+numdep);
 wait();
 
 }
 nbElements++;
 i=nbElements;
 }
 
 
 
 
 synchronized(ob[i-1])
 {
 
 tab[i-1]=val;
 
 
 System.out.println("Le producteur "+id+" dépose : "+val+" a la case "+ (i-1));
 }
 notifyAll();
 
 
 }

Cependant, j'obtiens un curieux comportement lors de l'exécution :

Le producteur 3 attend dans la file et nbElements = 4 et la taille du tableau : 4 depot : 0
Le producteur 3 attend dans la file et nbElements = 4 et la taille du tableau : 4 depot : 1
Le producteur 3 attend dans la file et nbElements = 4 et la taille du tableau : 4 depot : 2
Le producteur 3 attend dans la file et nbElements = 4 et la taille du tableau : 4 depot : 3

Le producteur 3 est sensé se mettre en attente, et même si il est réveillé, il est remit en attente grâce au while, mais pour le même dépot. Pourtant, il semble passer au dépot suivant sans avoir écrit quoi que ce soit. Mais aussi, qui réveille le producteur 3 ?

Je vous remercie.

Cordialement

pc15

Posts : 3
Join date : 02/10/2016

Voir le profil de l'utilisateur

Revenir en haut Aller en bas

Re: TD Questions 9 et 10

Message par pc15 le Dim Oct 02, 2016 5:59 pm

Rebonjour,

Mon erreur vient du fait que j'appelais wait() et notify() sur le buffer et non sur les objets synchronisés.

Seulement, une foi que j'exécute mon code, je ne comprend pas pourquoi les producteurs mis en attente ne se réveille pas :

Voici mes fonctions depot() et retrait() ainsi que la trace d’exécution :

Code:

public void depot(int val, int id, int numdep) throws InterruptedException
 {
 int i;
 
 synchronized(ob1)
 {
 
 while(nbElements==tab.length)
 {
 System.out.println("Le producteur "+id+ " attend dans la file et nbElements = "+nbElements+ " et la taille du tableau : "+tab.length+" depot : "+numdep);
 ob1.wait();
 
 }
 
 nbElements++;
 i=nbElements;
 
 }
 
 
 
 
 synchronized(ob[i-1])
 {
 
 System.out.println("prod");
 tab[i-1]=val;
 
 
 System.out.println("Le producteur "+id+" dépose : "+val+" a la case "+ (i-1));
 
 }
 
 ob1.notifyAll();
 ob[i-1].notifyAll();
 
 }
 
 public int retrait(int id) throws InterruptedException
 {
 int val=-1;
 int i;;
 synchronized(ob1)
 {
 while(nbElements==0)
 {
 System.out.println("Le consommateur "+id+" attend dans la file");
 ob1.wait();
 }
 
 i=--nbElements;
 
 }
 
 synchronized(ob[i])
 {
 val=tab[i];
 
 System.out.println("Le consommateur "+ id+" retire : "+val+" a la case : "+i);
 
 
 }
 ob1.notifyAll();
 ob[i].notifyAll();
 
 
 
 System.out.println("Le consommateur "+id+" reveille tout le monde");
 return val;
 
 
 }




Code:

Le producteur 1 dépose : 3 a la case 0
Le producteur 1 dépose : 91 a la case 1
Le producteur 1 dépose : 89 a la case 2
Le producteur 1 dépose : 14 a la case 3
      Le producteur 1 attend dans la file et nbElements = 4 et la taille du tableau : 4 depot : 4
      Le producteur 2 attend dans la file et nbElements = 4 et la taille du tableau : 4 depot : 0
      Le producteur 3 attend dans la file et nbElements = 4 et la taille du tableau : 4 depot : 0
Le consommateur 1 retire : 14 a la case : 3
Le consommateur 1 retire : 89 a la case : 2
Le consommateur 1 retire : 91 a la case : 1
Le consommateur 1 retire : 3 a la case : 0
Le consommateur 1 attend dans la file
Le consommateur 2 attend dans la file
Le consommateur 3 attend dans la file

Merci

pc15

Posts : 3
Join date : 02/10/2016

Voir le profil de l'utilisateur

Revenir en haut Aller en bas

Re: TD Questions 9 et 10

Message par Admin le Dim Oct 02, 2016 8:38 pm

C'est bien quand les réponses viennent toutes seules ;-).

En effet, votre souci provient bien d'une mauvaise granularité dans la gestion du verrouillage... Il y aura des discussions similaires dans les séquences de cours qui seront mises en ligne mardi.

Admin
Admin

Posts : 31
Join date : 24/08/2016

Voir le profil de l'utilisateur http://3i001-2016.forumactif.org

Revenir en haut Aller en bas

Re: TD Questions 9 et 10

Message par Contenu sponsorisé


Contenu sponsorisé


Revenir en haut Aller en bas

Voir le sujet précédent Voir le sujet suivant Revenir en haut

- Sujets similaires

 
Permission de ce forum:
Vous ne pouvez pas répondre aux sujets dans ce forum