IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Concurrence et multi-thread Java Discussion :

[Problème de Pipe] Communication entre Threads


Sujet :

Concurrence et multi-thread Java

  1. #1
    Candidat au Club
    Profil pro
    Inscrit en
    Mai 2011
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2011
    Messages : 5
    Points : 3
    Points
    3
    Par défaut [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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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.

  2. #2
    Expert éminent sénior
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 481
    Points : 48 806
    Points
    48 806
    Par défaut
    tes reader/writer ils sont créés comment?
    Un flush, ça se fait après une écriture pas avant
    Si ce sont des reader/writer, pourquoi tu essaie de faire du binaire dessus?
    Enfin, pour transférer des données entre Threads, il y a vachement plus simple avec les BlockingDeQueue

  3. #3
    Candidat au Club
    Profil pro
    Inscrit en
    Mai 2011
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2011
    Messages : 5
    Points : 3
    Points
    3
    Par défaut
    Les Readers/Writers sont créés et connectés dans le constructeur du Coordinateur. Puis le Coordinateur crée et lance les Assistants en transmettant les Readers/Writers par le constructeur des Assistants.
    Pour le reste je débute avec les tubes et les autres moyens de communication, j'ai pris le 1er truc que je trouvais pour avancer et faire mes tests.
    Je vais regarder la doc BlockingDeQueue et essayer avec alors.

    Merci pour ta réponse,
    oui je fais un peu n'importe quoi, j'ai peu travaillé les outils de communication ...

  4. #4
    Candidat au Club
    Profil pro
    Inscrit en
    Mai 2011
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2011
    Messages : 5
    Points : 3
    Points
    3
    Par défaut
    Merci pour ta suggestion, ça marche parfaitement bien avec les BlockingQueues.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [C#] Communication entre thread
    Par kekesilo dans le forum Windows Forms
    Réponses: 11
    Dernier message: 17/09/2007, 20h48
  2. [thread] communication entre threads
    Par untipy dans le forum Concurrence et multi-thread
    Réponses: 11
    Dernier message: 30/08/2007, 16h47
  3. Problème de communications entre threads
    Par maya09 dans le forum Windows
    Réponses: 1
    Dernier message: 22/02/2006, 23h18
  4. Communication entre thread
    Par JFPS Soft dans le forum Concurrence et multi-thread
    Réponses: 2
    Dernier message: 03/02/2006, 18h38
  5. [c#][threading] communication entre threads
    Par orelero dans le forum C#
    Réponses: 6
    Dernier message: 02/01/2006, 01h42

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo