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 :

question sur les pthreads


Sujet :

C

  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    52
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Janvier 2006
    Messages : 52
    Par défaut question sur les pthreads
    Bonsoir,

    J ai une question toute bete de conception.

    j ai un programme qui doit faire de chose en meme temps :
    - action A
    - action B

    La duree de l action A est egale a la duree du programme (equivalent au main quoi).
    La duree de l action B est inferieur (normalement) a la duree du programme.

    voila ce que ca fait :
    A est lancee et fait des calculs. Ensuite B est lancee.
    A peut continuer si B a rempli certaines taches, sinon A attend que B finisse une tache (comme le principe des lecteur et ecrivain, le lecteur attend que l ecrvian est ecrire dans ce fichier pour le lire).
    Une fois B terminer, A continue jusqu a la fin.

    Vaut il mieu faire 2 threads A et B, ou alors puis je faire un seul thread B et l action A devient le main ....
    Avec la seconde solution, je ne dois pas utiliser de pthread_join, et justement je me demande si cette facon n est pas de la programmation bourrin.

    Merci

  2. #2
    Membre averti
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    33
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 33
    Par défaut
    L'execution du main est un thread a part entiere. La deuxieme solution est bien meilleur. Par contre, je ne vois pas pourquoi tu devrais te passer du pthread_join...

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    52
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Janvier 2006
    Messages : 52
    Par défaut
    parce que si je met pthread_join, le main doit attendre que le thread lance est fini pour continuer.

    Voici le code de test :
    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
    #include <pthread.h>
    #include <stdio.h>
     
    void *incr(int *i)
    {
    	int j = 0;
    	while (j < 10) {
    		(*i)++;
      		j++;
    		sleep(1);
    }
       return NULL;
    }
     
    int main (void)
    {
       pthread_t ta;
       pthread_t tb;
       int i = 0;
       char *s1 = "a";
       char *s2 = "b";
     
       pthread_create (&ta, NULL, incr, &i);
     
       pthread_join (ta, NULL);
     
    	while (1) {
    		printf("%d\n", i);
    	}
     
       return 0;
    }

    et j obtiens :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    10
    10
    10
    10
    10
    10
    10
    10
    10
    10
    10
    10
    ......
    alors que quand je retire le pthread_join, j obtiens :
    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
    0
    0
    ...
    0
    1
    1
    ...
    1
    2
    2
    ...
    3
    ...
    4
    ...
    ...
    ...
    9
    10
    10
    10
    ...
    10
    Je veux que le main continue a faire ce qu il a a faire pendant que le thread B travaille...

  4. #4
    Expert confirmé

    Avatar de fearyourself
    Homme Profil pro
    Ingénieur Informaticien Senior
    Inscrit en
    Décembre 2005
    Messages
    5 121
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Ingénieur Informaticien Senior
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2005
    Messages : 5 121
    Par défaut
    Citation Envoyé par nivose110
    A peut continuer si B a rempli certaines taches, sinon A attend que B finisse une tache (comme le principe des lecteur et ecrivain, le lecteur attend que l ecrvian est ecrire dans ce fichier pour le lire).
    Donc il faudra sûrement une barrière, que cela soit avec un pthread_join ou autre chose... Cela dépend vraiment de l'implémentation du reste du programme...

    Vaut il mieu faire 2 threads A et B, ou alors puis je faire un seul thread B et l action A devient le main ....
    Vu que le main est un thread à lui tout seul, tu n'as besoin que d'en créer un autre...

    Avec la seconde solution, je ne dois pas utiliser de pthread_join, et justement je me demande si cette facon n est pas de la programmation bourrin.
    Je ne vois pas non plus pourquoi tu n'as plus besoin d'une barrière de synchro, si ton main devra attendre la fin d'une tâche de l'autre thread, tu vas devoir mettre une barrière...

    Jc

  5. #5
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 395
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 395
    Par défaut
    Il te faudra utiliser un objet de synchronisation pour les prérequis en cours de traitement : événement, buffer circulaire à sémaphores, etc.

    Et pour la fin du traitement, un pthread_join().
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  6. #6
    Membre confirmé
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    138
    Détails du profil
    Informations personnelles :
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations forums :
    Inscription : Mai 2006
    Messages : 138
    Par défaut
    Citation Envoyé par nivose110
    parce que si je met pthread_join, le main doit attendre que le thread lance est fini pour continuer.

    Voici le code de test :
    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
    #include <pthread.h>
    #include <stdio.h>
     
    void *incr(int *i)
    {
    	int j = 0;
    	while (j < 10) {
    		(*i)++;
      		j++;
    		sleep(1);
    }
       return NULL;
    }
     
    int main (void)
    {
       pthread_t ta;
       pthread_t tb;
       int i = 0;
       char *s1 = "a";
       char *s2 = "b";
     
       pthread_create (&ta, NULL, incr, &i);
     
       pthread_join (ta, NULL);
     
    	while (1) {
    		printf("%d\n", i);
    	}
     
       return 0;
    }

    et j obtiens :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    10
    10
    10
    10
    10
    10
    10
    10
    10
    10
    10
    10
    ......
    C normal que tu obtiennes ce résultat car après le pthread_join i ne bouge plus .

    Si tu fais :

    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
    #include <pthread.h>
    #include <stdio.h>
     
    void *incr(int *i)
    {
    	int j = 0;
    	while (j < 10) {
    		(*i)++;
      		j++;
    		sleep(1);
    }
       return NULL;
    }
     
    int main (void)
    {
       pthread_t ta;
       pthread_t tb;
       int i = 0;
       char *s1 = "a";
       char *s2 = "b";
     
       pthread_create (&ta, NULL, incr, &i);
     
    while (1) {
    		printf("%d\n", i);
    	}
     
       pthread_join (ta, NULL);
     
     
       return 0;
    }
    et que dans ton thread tu met un usleep (5000) peut-être que ton thread laissera le temps à ton main de faire un affichage.(mais je n'ai pas testé )

  7. #7
    Expert confirmé
    Avatar de PRomu@ld
    Homme Profil pro
    Ingénieur de Recherche
    Inscrit en
    Avril 2005
    Messages
    4 155
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Vienne (Poitou Charente)

    Informations professionnelles :
    Activité : Ingénieur de Recherche
    Secteur : Enseignement

    Informations forums :
    Inscription : Avril 2005
    Messages : 4 155
    Par défaut
    et que dans ton thread tu met un usleep (5000) peut-être que ton thread laissera le temps à ton main de faire un affichage.(mais je n'ai pas testé )
    Utilise plutôt un pthread_yield, ça permet de forcer le relachement du processeur et donc de ne pas monopoliser.. J'ai eu le problème sur une appli graphique/OpenGL, ceci à résolu mon problème.

  8. #8
    Membre confirmé
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    138
    Détails du profil
    Informations personnelles :
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations forums :
    Inscription : Mai 2006
    Messages : 138
    Par défaut
    Citation Envoyé par PRomu@ld
    Utilise plutôt un pthread_yield, ça permet de forcer le relachement du processeur et donc de ne pas monopoliser.. J'ai eu le problème sur une appli graphique/OpenGL, ceci à résolu mon problème.
    Oui effectivement je pense que ta solution est préférable et sera moins aléatoire que celle que je proposée

  9. #9
    Membre Expert
    Inscrit en
    Décembre 2004
    Messages
    1 478
    Détails du profil
    Informations forums :
    Inscription : Décembre 2004
    Messages : 1 478
    Par défaut
    Citation Envoyé par PRomu@ld
    Utilise plutôt un pthread_yield
    Attention, cette fonction ne fait pas partie du pthread standard. C'est une extension GNU.

  10. #10
    Expert éminent
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 68
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Par défaut
    Citation Envoyé par nivose110
    J ai une question toute bete de conception.

    j ai un programme qui doit faire de chose en meme temps :
    - action A
    - action B
    http://emmanuel-delahaye.developpez.com/pthreads.htm

  11. #11
    Membre averti
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    52
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Janvier 2006
    Messages : 52
    Par défaut
    ok je vais essayer le pthread_yield.

    Emmanuel j ai vu ta page, mais mes threads A et B doivent travailler sur les meme variables.

    Avec pthread_join, le main (process A) attend la terminaison du thread pour afficher la varaible i. Or ce n est pas ce que je veut, je voudrais qu il l affiche avant, pendant et apres l execution du thread, d ou pour moi le besoin de supprimer le pthread_join ou alors de mettre ce que doit faire le main dans un thread.

    J ai essaye avec le pthread_yield(), que je met apres l incrementation de i dans la fonction incr, mais rien n y fait, le main affiche toujourd apres l execution du thread (meme apres avoir mis un sleep(5)).


    A moins de mettre le pthread_join a la fin du main....

  12. #12
    Membre averti
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    52
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Janvier 2006
    Messages : 52
    Par défaut
    c est bon, c est ce qu il fallait faire, mettre le pthread_join a la fin du main .
    Comme ca une fois que le main a fini de faire ce qu il a a faire, il attend que le thread soit fini pour terminer.

  13. #13
    Expert éminent
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 68
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Par défaut
    Citation Envoyé par nivose110
    c est bon, c est ce qu il fallait faire, mettre le pthread_join a la fin du main .
    Comme ca une fois que le main a fini de faire ce qu il a a faire, il attend que le thread soit fini pour terminer.
    C'est pas comme ça dans les exemples que j'ai donné ?

  14. #14
    Membre averti
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    52
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Janvier 2006
    Messages : 52
    Par défaut
    oui

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

Discussions similaires

  1. Petite question sur les performances de Postgres ...
    Par cb44 dans le forum PostgreSQL
    Réponses: 5
    Dernier message: 13/01/2004, 13h49
  2. question sur les vertex buffer et index buffer
    Par airseb dans le forum DirectX
    Réponses: 9
    Dernier message: 25/08/2003, 02h38
  3. question sur les variables globales et les thread posix
    Par souris_sonic dans le forum POSIX
    Réponses: 5
    Dernier message: 13/06/2003, 13h59
  4. Question sur les handles et les couleurs...
    Par MrDuChnok dans le forum C++Builder
    Réponses: 7
    Dernier message: 29/10/2002, 08h45
  5. question sur les message box !
    Par krown dans le forum Langage
    Réponses: 7
    Dernier message: 02/08/2002, 16h11

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