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 :

PB sortie standard avec les PTHREAD !!!


Sujet :

C++

  1. #1
    Nouveau Candidat au Club
    Inscrit en
    Mai 2003
    Messages
    6
    Détails du profil
    Informations forums :
    Inscription : Mai 2003
    Messages : 6
    Points : 1
    Points
    1
    Par défaut PB sortie standard avec les PTHREAD !!!
    Bonjour,
    ça fait un moment que je bute sur ce probleme sans résultat :

    pourquoi la sortie standard ne marche plus lorsqu'un pthread se termine ?

    J'ai simplifié le programme au maximum (un Client/Serveur à la base) pour trouver le probleme et ... la solution...
    ce bout de code compile en C++ avec g++ (sans doute en c aussi avec gcc), sous Linux ou sous windows avec cygwin (c'est mon cas) avec la commande
    g++ -o tt test_thread.cpp -lpthread


    le 'main' créer un thread qui va durer 5 secondes, et pendant ce temps, il compte 10 secondes

    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
    #include <stdio.h>
    #include <pthread.h>
    #include <iostream>
    using namespace std;
     
    void* tache(void * arg)
    {
            printf("threaddémarrer attente de 5 sec...\n");
            sleep(5);
    }
     
    int main(int argc, char argv[])
    {
            pthread_t thread_id;
     
            pthread_attr_t attribut;
            pthread_attr_init(&attribut);
            pthread_attr_setdetachstate(&attribut,PTHREAD_CREATE_DETACHED); 
     
            if (pthread_create(&thread_id, &attribut,tache, NULL) == -1)
                    printf("Unable to create the thread\n");
     
     
            for(int j = 0; j < 10; j++)
            {
                    printf("  'main' toujours en travail, j = %d\n", j);
                    sleep(1);
            }    
    }
    le probleme c'est que la sortie donne :

    C:\cygwin\home\Administrateur>tt.exe
    'main' toujours en travail, j = 0
    threaddémarrer attente de 5 sec...
    'main' toujours en travail, j = 1
    'main' toujours en travail, j = 2
    'main' toujours en travail, j = 3
    'main' toujours en travail, j = 4

    C:\cygwin\home\Administrateur>
    les 5 dernieres secondes sont comptées mais pas affichées !!!

    Merci beaucoup d"avance !

  2. #2
    Expert confirmé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Décembre 2003
    Messages
    3 549
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Décembre 2003
    Messages : 3 549
    Points : 4 625
    Points
    4 625
    Par défaut
    personnellement, quand je compile avec cygwin, je n'ai plus de sortie du tout.

  3. #3
    Nouveau Candidat au Club
    Inscrit en
    Mai 2003
    Messages
    6
    Détails du profil
    Informations forums :
    Inscription : Mai 2003
    Messages : 6
    Points : 1
    Points
    1
    Par défaut
    personnellement, quand je compile avec cygwin, je n'ai plus de sortie du tout.
    sisi, j'ai les entrées et les sorties, et si je copie cygwin1.dll dans le repertoire de l'executable, je peux exécuter le programme dans un un editeur de commande DOS (l'extrait est d'ailleur un copier/coller d'une cmd DOS) ou simplement double cliquer dessus comme n'importe quel programme windows...

    Je ne crois pas que cela vienne de cygwin...
    Merci quand meme

  4. #4
    Nouveau Candidat au Club
    Inscrit en
    Mai 2003
    Messages
    6
    Détails du profil
    Informations forums :
    Inscription : Mai 2003
    Messages : 6
    Points : 1
    Points
    1
    Par défaut
    bon, il semble que ça ne vien pas du code, j'ai compilé un programme d'exemple, et meme probleme, ça doit venir de cygwin... faut que j'essaye sous Linux...

    l'exemple 3 du site :
    http://www.tvtsii.net/sections.php?op=printpage&artid=68
    donne
    C:\cygwin\home\Administrateur>tt.exe
    Creation du threadThread is running ...

    Sample : blablabla
    Sample : 1500000
    Sample : 0
    Thread is finish.

    C:\cygwin\home\Administrateur>
    alors qu'il devrai y avoir "Programme terminé" à la fin...

  5. #5
    Membre du Club
    Inscrit en
    Novembre 2003
    Messages
    40
    Détails du profil
    Informations forums :
    Inscription : Novembre 2003
    Messages : 40
    Points : 68
    Points
    68
    Par défaut
    chez pô,
    j'utilise pthread sous linux, ca m'a jamais fait ca...
    pourquoi tu n'utilises pas pthread_join ??

    J'e crois que du viens de démontrer a nouveau l'exactitude de ce qu'on peut obtenir sous micros~1 suxdows...

    </troll>

  6. #6
    Rédacteur/Modérateur
    Avatar de JolyLoic
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    5 463
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Yvelines (Île de France)

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

    Informations forums :
    Inscription : Août 2004
    Messages : 5 463
    Points : 16 213
    Points
    16 213
    Par défaut
    <Troll>A mon avis, tout ce que ça peut démontrer, c'est la compétence des développeurs GNU quand ils essayent de porter pthread sous windows.</Troll>

    Le code suivant utilisant les threads natives windows produit le résultat attendu :
    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
    #include <stdio.h>
    #include <windows.h>
    #include <process.h>   
    #include <iostream>
    using namespace std;
     
    void tache(void * arg)
    {
        printf("threaddémarrer attente de 5 sec...\n");
        Sleep(5000);
    }
     
    int main(int argc, char argv[])
    {
    	uintptr_t h= _beginthread(&tache, 0, NULL);
        for(int j = 0; j < 10; j++)
        {
                printf("  'main' toujours en travail, j = %d\n", j);
                Sleep(1000);
        }   
    }

  7. #7
    Nouveau Candidat au Club
    Inscrit en
    Mai 2003
    Messages
    6
    Détails du profil
    Informations forums :
    Inscription : Mai 2003
    Messages : 6
    Points : 1
    Points
    1
    Par défaut
    pourquoi tu n'utilises pas pthread_join ??
    non je doit utiliser des threads détachés, c'est un client/serveur qui peut gérer plusieur clients en meme temps, un thread par client qui demande une requette... donc les threads sont indépendants.

    Mais le probleme est le même avec les threads attachés !


    j'ai trouvé une solution temporaire : je met un à la fin de chaque fonction de thread, comme je ne créé pas trop de thread (c'est un test pour l'instant), et que je fait pas de pthread_join ça peut suffir....

    Le code suivant utilisant les threads natives windows produit le résultat attendu :
    c'est sympas, mais mon projet doit être sous Linux...

    je confirmerai que ça viens bien de Cygwin quand je l'aurai tester sous Linux...

    Merci tout le monde

  8. #8
    Expert éminent sénior

    Homme Profil pro
    pdg
    Inscrit en
    Juin 2003
    Messages
    5 752
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : pdg

    Informations forums :
    Inscription : Juin 2003
    Messages : 5 752
    Points : 10 683
    Points
    10 683
    Billets dans le blog
    3
    Par défaut
    Y'aurait une solution qui ne sorrigerait pas la cause mais la conséquence qui est de réouvrir les flux standards que cygwin doit fermer lors de la fin d'un thread.
    A tester :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    freopen( "CONOUT$", "w", stdout );
    freopen( "CONOUT$", "w", stderr );
    freopen( "CONin$", "w", stdin );
    Pour les trolleurs, rappelons que les threads existent sous Windows depuis plus de 10 ans...

  9. #9
    Nouveau Candidat au Club
    Inscrit en
    Mai 2003
    Messages
    6
    Détails du profil
    Informations forums :
    Inscription : Mai 2003
    Messages : 6
    Points : 1
    Points
    1
    Par défaut
    bonne idée mais ça marche pas, je dirai meme que c'est pire, dès les instructions freopen... il n'y a plus de sortie (thread fermé ou non)
    merci quand meme

  10. #10
    Expert confirmé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Décembre 2003
    Messages
    3 549
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Décembre 2003
    Messages : 3 549
    Points : 4 625
    Points
    4 625
    Par défaut
    Pour les trolleurs, rappelons que les threads existent sous Windows depuis plus de 10 ans...
    Windows ne supporte pas de réel multithreading.

  11. #11
    Expert éminent sénior

    Homme Profil pro
    pdg
    Inscrit en
    Juin 2003
    Messages
    5 752
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : pdg

    Informations forums :
    Inscription : Juin 2003
    Messages : 5 752
    Points : 10 683
    Points
    10 683
    Billets dans le blog
    3
    Par défaut
    Ce genre de réponses évasives sans argument ne va pas en ta faveur. Peut être évoques-tu le multitâche coopératif de Win3x, qui n'est plus depuis Win95, et qui n'a jamais été sous NT.

  12. #12
    Expert confirmé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Décembre 2003
    Messages
    3 549
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Décembre 2003
    Messages : 3 549
    Points : 4 625
    Points
    4 625
    Par défaut
    Ce n'est pas tout à fait cela.
    Un recherche rapide sur google donne ce genre de résultats.

  13. #13
    Expert éminent sénior

    Homme Profil pro
    pdg
    Inscrit en
    Juin 2003
    Messages
    5 752
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : pdg

    Informations forums :
    Inscription : Juin 2003
    Messages : 5 752
    Points : 10 683
    Points
    10 683
    Billets dans le blog
    3
    Par défaut
    Dont on peut extraire ceci :
    NT, which is a new operating system written from scratch, capable of true multitasking behaviour
    NT and Win2000 [...]are true multitasking environments

  14. #14
    Expert confirmé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Décembre 2003
    Messages
    3 549
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Décembre 2003
    Messages : 3 549
    Points : 4 625
    Points
    4 625
    Par défaut
    NT, mais pas 9x.
    De toutes façons c'est sans réel intérêt, c'était pour alimenter le troll.

  15. #15
    Membre à l'essai
    Inscrit en
    Novembre 2004
    Messages
    13
    Détails du profil
    Informations forums :
    Inscription : Novembre 2004
    Messages : 13
    Points : 11
    Points
    11
    Par défaut
    Essaie d'utiliser pthread_exit(NULL) pour quitter de ton thread.
    C'est aussi peut-être un problème relatif à Cygwin tu peux essayer avec MingW

    @+

  16. #16
    Nouveau Candidat au Club
    Inscrit en
    Mai 2003
    Messages
    6
    Détails du profil
    Informations forums :
    Inscription : Mai 2003
    Messages : 6
    Points : 1
    Points
    1
    Par défaut
    Le code (de mon premier message) marche nikel sous Linux...
    J'ai pas verifier pthread_exit(NULL) avec Cygwin, mais il me semble l'avoir déjà essayé...

    Merci à tous, mais il semble que le probleme vienne finalement de Cygwin...
    A vérifier...

Discussions similaires

  1. Rediriger les entrée et sortie standard
    Par latitude38 dans le forum Code::Blocks
    Réponses: 1
    Dernier message: 05/11/2014, 11h11
  2. [Net-SNMP] Utiliser la sortie standard avec snmptrapd
    Par zodd dans le forum Applications
    Réponses: 0
    Dernier message: 08/10/2013, 14h40
  3. Ecrire sur la sortie standard avec write
    Par overlolo dans le forum Débuter
    Réponses: 8
    Dernier message: 13/04/2009, 00h07
  4. utilisation d'un timer avec les pthreads
    Par dc.sara dans le forum C
    Réponses: 8
    Dernier message: 15/01/2008, 13h12
  5. Réponses: 2
    Dernier message: 10/02/2007, 12h07

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