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

C++ Discussion :

Synchronisation entre 2 threads


Sujet :

C++

  1. #1
    Rédacteur

    Profil pro
    Inscrit en
    Avril 2004
    Messages
    94
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 94
    Points : 448
    Points
    448
    Par défaut Synchronisation entre 2 threads
    Bonjour,

    Voila, j'ai un petit probleme pour synchroniser 2 threads.

    J'ai tenter un peu tout (mutex(s),event(s) ) sans succes

    J'ai donc 2 threads de lancés dans lesquels se trouve une boucle while


    Dans la premiere boucle while, je voudrais lancer un cycle de la 2e boucle while (du thread 2). Et attendre que la boucle2 est fini son premier tour avant de continuer le premiere boucle.
    Et ainsi de suite.

    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
    16
    17
    18
    19
    20
    21
    22
    23
    thread1(...)
    {
       while(1) // boucle1
       {
           // lache un tour de la boucle thread2
           // attente d'un tour de la boucle2
           // un tour de boucle2 effectué
     
           ...
           ...
       }
    }
     
     
    thread2(...)
    {
       while(1) // boucle2
       {
           // attente de la boucle1
           ...
           // redonne la main a la boucle 1
       }
    }
    pouvez vous me donner une piste pour resoudre ce probleme

    merci

  2. #2
    Membre régulier
    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    77
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2004
    Messages : 77
    Points : 83
    Points
    83
    Par défaut
    Artillerie mourde : simulation de coroutine avec 2 mutex

    T1 prend MA, fait sa boucle, lache MA et prend MB
    T2 prend MB, fait sa boucle, lache MB et prend MA

    on ne sait pas ce qui se passe sur la première boucle.

    Si windows : utiliser les fibres.... (=simulation de coroutines, voir CreateFiber)

  3. #3
    Rédacteur

    Profil pro
    Inscrit en
    Avril 2004
    Messages
    94
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 94
    Points : 448
    Points
    448
    Par défaut
    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
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
     
    // variables globales
    hMA = createmutex(...);
    hMB = createmutex(...);
     
    thread1(...) 
    { 
       while(1) // boucle1 
       { 
           // La boucle 1 doit commencer par faire travaille la boucle 2
           Release(hMA) 
           Waitforsingleobject(hMB)
           Waitforsingleobject(hMA) 
           ... 
           ... 
       } 
    } 
     
     
    thread2(...) 
    { 
       while(1) // boucle2 
       { 
           Waitforsingleobject(hMB)
           ... 
           Release(hMB)
           Waitforsingleobject(hMA)
       } 
    } 
    // ** version simplifié bien sur :D **
    Comme ca ?

  4. #4
    Rédacteur

    Profil pro
    Inscrit en
    Avril 2004
    Messages
    94
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 94
    Points : 448
    Points
    448
    Par défaut
    Citation Envoyé par bjousse
    on ne sait pas ce qui se passe sur la première boucle.

    Si windows : utiliser les fibres.... (=simulation de coroutines, voir CreateFiber)
    Oui Windows

    Ah, je ne connais pas les fibres.
    Je vais chercher de la doc dessus.
    Au moin si je peux apprendre qqchose, ca sera bien aussi

  5. #5
    Rédacteur

    Profil pro
    Inscrit en
    Avril 2004
    Messages
    94
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 94
    Points : 448
    Points
    448
    Par défaut
    J'ai trouvé une bidouille qui me deplait mais qui marche
    Ce qui me gene, c'est que la boucle d'attente fait office de waitforsingleobject

    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
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
     
    HANDLE	hMutex1 ;
     
    // le main
    void main(void)
    {
     
    	hMutex1=CreateMutex(NULL,TRUE,NULL);
     
     
    	CreateThread(0,0,(LPTHREAD_START_ROUTINE)Fonc1,0,0,NULL);
     
    	while(1)
    	{
    		while(LeBool==TRUE)
    			Sleep(50);
     
     
    		cout << "un tour " << endl ;
    		Sleep(500);
     
    		LeBool=TRUE ;
    	}
     
    	cout << "fin du main" << endl ;
    	getchar();
    }
     
     
    void Fonc1(void)
    {
    	while(1)
    	{
    		while(LeBool==FALSE)
    			Sleep(50);
     
    		cout << "fonction 1" << endl ;
    		Sleep(200);
     
    		LeBool=FALSE ;
    	}
    }

  6. #6
    Membre régulier
    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    77
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2004
    Messages : 77
    Points : 83
    Points
    83
    Par défaut
    si c'est pour du windows, c'est l'idéal pour les fibres. C'est un truc qui a été rajouté à la sortie de w2k pour simuler les coroutines

  7. #7
    Rédacteur

    Profil pro
    Inscrit en
    Avril 2004
    Messages
    94
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 94
    Points : 448
    Points
    448
    Par défaut
    Finalement, quand j'ai changé de machine (pour une + lente), le programme s'est mis a deconner.

    Hier je n'ai pas trouver beaucoup d'info sur les fibres.

    Aujourd'hui, j'ai pu "verrouillé" ma precedente version avec une section critique.

  8. #8
    Membre régulier
    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    77
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2004
    Messages : 77
    Points : 83
    Points
    83
    Par défaut
    si ca ne marche plus en changeant de machine, c'est que la logique est mauvaise.....

    un point d'entrée sur les fibres :
    http://<br /> http://msdn.microsoft...ase/fibers.asp

    bon courage....

  9. #9
    Rédacteur

    Profil pro
    Inscrit en
    Avril 2004
    Messages
    94
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 94
    Points : 448
    Points
    448
    Par défaut
    Desolé pour le retard.

    Le programme fonctionne bien depuis hier donc je vais pas toucher maintenant, mais j'esserai de voir les Fibres en temps venu

    merci

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

Discussions similaires

  1. Synchronisation entre les Thread
    Par Red Sno dans le forum C
    Réponses: 2
    Dernier message: 07/12/2012, 22h34
  2. Problème de synchronisation entre Thread et VCL
    Par Jipété dans le forum Débuter
    Réponses: 33
    Dernier message: 21/05/2012, 11h14
  3. Problème de rafraichissement [EDIT: Synchronisation entre threads ]
    Par Nicolus dans le forum GTK+ avec C & C++
    Réponses: 4
    Dernier message: 29/10/2011, 14h37
  4. Réponses: 2
    Dernier message: 29/04/2007, 19h59
  5. synchronisation entre deux threads
    Par chabfive dans le forum Concurrence et multi-thread
    Réponses: 9
    Dernier message: 03/11/2006, 12h17

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