Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
872 connectés 

  FORUM HardWare.fr
  Programmation
  Java

  Synchronisation de threads

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

Synchronisation de threads

n°390582
Vic le vik​ing
Posté le 12-05-2003 à 15:49:07  profilanswer
 

bonjour
 
en cours, on a commencé les threads en java, et je comprends rien sur la synchronisation, c'est pas évident.
 
je donne un exemple d'un exercice qui me pose probleme :
 
- je créé une fonction (threadFonction)dans laquelle une boucle while tourne jusque ce que i == true
- a la fin de cette boucle while, je fais un appel à une fonction nettoyer()
 
dans mon programme principal, je créé ensuite 8 threads qui executent tous la meme fonction (threadFonction)
 
et mon probleme est la : sachant que la threadFonction est executée 8 fois simultanement, comment faire pour appeler la fonction nettoyer() qu'une seule fois ?
 
j'ai vu des sources en C# dans lesquels le thread envoie un evenement au thread principal qui se charge ensuite d'appeler l'equivalent de ma fonction nettoyer(), mais j'aurais voulu savoir d'autres manieres de faire plus simples.
 
benou, à l'aide ;)


---------------
Bougredane et bougre d'andouille ne font qu'un !
mood
Publicité
Posté le 12-05-2003 à 15:49:07  profilanswer
 

n°390586
bobuse
Posté le 12-05-2003 à 15:53:28  profilanswer
 

t'es aller voir les tuts de sun ?  :heink:


---------------
get amaroK plugin
n°390588
benou
Posté le 12-05-2003 à 15:54:20  profilanswer
 

il y a une chose simple à faire :
 

Code :
  1. private nettoyerDone = false;
  2. publiv void synchronized nettoyer() {
  3.    if (! nettoyerDone) {
  4.       // ici tu mets ton code de nettoyage
  5.      nettoyerDone = true;
  6.    }
  7. }


la méthode sera appelée plusieurs fois, mais jamais 2 fois en même temps (puisqu'elle est synchronized), et dans le cas où elle a déjà été appellée, les futurs appels ne ferons rien.
 
C'est une solution simple à ton problème

n°390605
Vic le vik​ing
Posté le 12-05-2003 à 16:02:58  profilanswer
 

benou a écrit :

il y a une chose simple à faire :


merci, j'avais du mal a comprendre l'utilité de synchronized, je viens de comprendre :jap:
en fait, ce mot clé garantit que la methode ne sera accédee que par un thread a la fois.
mais que font les autres threads pendant ce temps ? ils attendent que le thread soit sorti de la methode pour y rentrer ?
et tu penses quoi de la methode de harkonnen (un evenement envoyé par le thread au programme principal), c'est aussi propre que ce que tu me proposes ?


---------------
Bougredane et bougre d'andouille ne font qu'un !
n°390649
benou
Posté le 12-05-2003 à 16:30:55  profilanswer
 

vic le viking a écrit :

mais que font les autres threads pendant ce temps ? ils attendent que le thread soit sorti de la methode pour y rentrer ?


bha oui ...
 

vic le viking a écrit :


et tu penses quoi de la methode de harkonnen (un evenement envoyé par le thread au programme principal), c'est aussi propre que ce que tu me proposes ?


le truc d'harko peut marcher aussi :
tu peut mettre ton thread principal en attante en fesant ca après avoir lancé tes threads :
 
 

Code :
  1. sycnhronized (this) {
  2.    try {
  3.       this.wait();
  4.    } catch (InterruptedException e) {
  5.       Thread.currentThread().interrupt();
  6.    }
  7. }
  8. nettoyer();


 
et dans chacun de tes threads, il faudra qu'il possède une référence de ton thread pricnipal (ou plus précisément de l'objet que représente this dans le code ci-dessus), et plutot que d'appeler nettoyer à la fin de la boucle, tu mets ce code là :

Code :
  1. while (tonBooleen) {
  2. ...
  3. }
  4. sycnhronized (lObjetSurLequelTuAsFaiWait) {
  5.    lObjetSurLequelTuAsFaiWait.notify();
  6.    // ca réveille le thread dans lequel le wait a été fait
  7. }


 
les deux méthodes sont valables. Dans la mienne l'inconvénient est que tous les threads vont se bloquer sur la méthode nettoyer le temps que celle-ci soit executée, dans la méthode harko, le problème c'est que ca bloque le thread principal ...

n°390750
Vic le vik​ing
Posté le 12-05-2003 à 17:33:51  profilanswer
 

merci pour ton explication claire :jap:
mine de rien, j'ai largement mieux compris ton explication que celle du prof :(
par curiosité, tu emploies quelle méthode dans ton bot ? celle que tu décris, ou celle de harkonnen ?


---------------
Bougredane et bougre d'andouille ne font qu'un !
n°390759
benou
Posté le 12-05-2003 à 17:42:51  profilanswer
 

j'utilise les 2.
 
en fait j'utilise la 1ere méthode de façon à ce que je n'ai qu'un seul thread qui fasse le notify pare que dans mon cas c'est important : je remets le thread principal en wait juste après qu'il ait été redémarré => si un des autres thread le notify, ca le réveil alors que ca n'aurait pas dû.


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  Java

  Synchronisation de threads

 

Sujets relatifs
Arrêt individuel de tous les threads d'un ThreadPool[C/C++] Thread et accès à une variable par 2 threads en même temps...
Threads : méthodes dépréciéesthreads, suspend() et resume() (nouveau pb dernier post)
[PERL] Problême de data sharing entre plusieurs threads...Lancer plusieurs threads en python
synchronisation de processusLinux, ports série et pb de synchronisation (pour experts)
C'est chaud l'utilisation de threads ?je cherche un tuto sur les threads en c++
Plus de sujets relatifs à : Synchronisation de threads


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR