[Problème de Pipe] Communication entre Threads
Bonjour à la communauté.
Dans le cadre d'un projet du Jeu de la vie en java je dois implémanter deux types de threads. Un thread Coordinateur qui va effectuer certaines taches, mais surtout échanger avec plusieurs threads Assistants. Pour ce qui est de la gestion de la concurrence j'ai implémenté l'algorithme de Peterson afin que l'écriture/lecture sur les pipes se fasse par un seul thread Assistant à la fois. Le jeu de la vie n'ayant pas de fin, ces deux types de threads tournent en boucle dans un while(true) imposé par l'enseignant.
Je dispose de, 2 pipewriter et 2 pipereader. Pipewriter canalEcriturepcpa n'est utilisé que par le Coordinateur pour l'écriture et PipeReader canalLecturepcpa n'est utilisé que par un Assistant pour la lecture des données venant du Coordinateur. Je dispose d'un même couple pour le sens inverse, écriture par un Assistant et lecture par le Coordinateur. Enfin pour faire en sorte que chaque thread ne lise son pipe uniquement que lorsque l'écriture de l'autre thread est effectuée, j'ai implémenté un système de signal d'attente par occupation.
Voici une portion de code du coté d'un Assistant lorsqu'il est en session critique :
Code:
1 2 3 4 5 6 7 8
|
public void Echange(){
ecrireCanalPaPc(identifiant);//Envoie au Coordinateur son identifiant sur le PipeWriter PaPc
signalpapc.setReading(true);//Signale au Coordinateur qu'il peut lire le PipeReader PaPc
attendreMessagePc(signalpcpa);//Attente par occupation tant que le Coordinateur n'a rien écrit en retour
lireCanalPcPa();//Lecture du PipeReader PcPa
signalpcpa.setReading(false);//Signale que la lecture a été effectuée
} |
Une portie de code du coté Coordinateur :
Code:
1 2 3 4 5 6 7 8 9
|
public void Echange(){
int x;
attendreMessagePa(signalpapc);//Attente par occupation tant qu'un Assistant n'a rien écrit
x = lireCanalPaPc();//Lecture du PipeReader PaPc
signalpapc.setReading(false);//Signale a l'Assistant que la lecture a été effectuée
ecrireCanalPcPa(5);//Envoie a l'Assistant une valeur en retour sur le PipeWriter PcPa
signalpcpa.setReading(true);//Signale à l'Assistant qu'il peut lire le PipeReader Pcpa
} |
Un exemple d'écriture et de lecture des pipes :
Code:
1 2 3 4 5 6 7 8 9
|
public synchronized void ecrireCanalPcPa(int v){
try{
canalEcriturepcpa.flush();
canalEcriturepcpa.write(v);
}catch (IOException e) {
e.printStackTrace();
}
} |
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
|
public synchronized int lireCanalPaPc(){
int x = -2;
try{
if(canalLecturepapc.ready()){
System.out.println("Pc : Message provenant du processus : "+canalLecturepapc.read());
x = (int) canalLecturepapc.read();
}else{System.out.println("Pc : Rien dans le Pipe");}
return x;
}catch (IOException e) {
e.printStackTrace();
}
//return x;
} |
Console :
Code:
1 2 3
|
Processus id : 1 est en SC
Pc : Message provenant du processus : 1 |
Et plus rien ...
Mon soucis c'est que la lecture par le Coordinateur s'effectue correctement, mais tout se bloque au niveau de l'écriture dans l'autre sens, aucune exception n'est levée ... rien. J'ai effectué plusieurs tests avec 1 seul Assistant et je me suis rendu compte que si je fermais les canaux cela fonctionnait à merveille, sinon une Exception PipeBroken ou Write end dead était levée. Le problème, c'est que je ne peux pas fermer les canaux car je suis sensé faire tourner 16 assistants minimum, et j'obtiens donc une exception PipeClosed.
Je dois donc vous avouer avoir un problème d'approche et je ne sais plus sur quoi partir pour régler le problème. Je suis biensur ouvert à toute question, j'espère avoir bien expliqué mon soucis.
Amicalement.