TD Questions 9 et 10
2 participants
Page 1 sur 1
TD Questions 9 et 10
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 :
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
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
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
Re: TD Questions 9 et 10
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 :
Merci
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
Re: TD Questions 9 et 10
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.
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.
Page 1 sur 1
Permission de ce forum:
Vous ne pouvez pas répondre aux sujets dans ce forum
|
|