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 :

Threads en C++ (sans boost ?)


Sujet :

C++

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Décembre 2006
    Messages : 8
    Par défaut Threads en C++ (sans boost ?)
    Bonjour,

    je cherche à lancer une simple thread en c++, mais je me demandais s'il n'était pas possible de s'affranchir des librairies genre boost pour celà... J'imagine que celà n'est pas faisable, mais je voudrais surtout une confirmation afin de me convaincre.

    J'ai essayé par exemple d'utiliser pthread.h comme ceci :

    void testDaemon(void *params)
    {
    DemonstratorInt* demonstrator = (DemonstratorInt*)params ;
    }

    void DemonstratorInt::init()
    {

    // (...)

    pthread_t thread_commands;

    pthread_create(&thread_commands, NULL, (void *(*)(void *))testDaemon, this);

    // (...)

    }
    Celà me retournant une erreur :

    undefined reference to pthread_create

    (je précise que j'ai bien inclu la librairie )

    D'avance, merci beaucoup.
    Max.

  2. #2
    Rédacteur

    Avatar de millie
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    7 015
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 7 015
    Par défaut


    Bienvenue à toi sur developpez.com

    Citation Envoyé par rbcmax
    (je précise que j'ai bien inclu la librairie )
    Dans ce cas, il faudrait aussi penser à inclure le fichier d'entête.

    Le terme librairie n'existe pas en français pour ce genre de chose. En effet, à chaque fois que tu utilises une fonction, tu ne vas pas l'acheter, on parle donc de bibliothèque. Et on inclut pas de bibliothèque, on inclut des fichiers d'entête et on lie les fichiers objets avec une bibliothèque. La traduction de Library en anglais est Bibliothèque en français, c'est vrai que c'est piégeux

    Je ne comprends pas le rapport avec boost, pthread est une bibliothèque indépendante et qui fonctionne en C.

    Regarde la page suivante qui est très bien :
    http://emmanuel-delahaye.developpez.com/pthreads.htm

    Si tu as un problème avec le premier programme, c'est qu'il doit te manquer des fichiers d'entêtes ou la bibliothèque.

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Décembre 2006
    Messages : 8
    Par défaut
    Hello

    En effet je voulais dire fichier d'en-tête par librairie, erreur de vocabulaire de ma part.

    Et je l'inclus bien ; si je supprime un argument de pthread_create, il me renvoie une erreur "blabla too few argument : prototype is (ici suit le prototype de pthread_create"). J'imagine que si je ne l'avais pas correctement inclus, je n'aurais pas ca.

    On dirait que j'ai le message d'erreur que j'ai cité plus haut dès que ma fonction est correctement appellée... A la moindre petite erreur dans son appel il me la signale correctement.

    Ce serait donc un problème sur le système même ? Ou bien le C++ a du mal avec les fonctions écrites pr le C ?

  4. #4
    Rédacteur

    Avatar de millie
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    7 015
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 7 015
    Par défaut
    Ton cast est bizarre, essaye juste ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    thread_create(&thread_commands, NULL, testDaemon, this);

  5. #5
    Membre du Club
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Décembre 2006
    Messages : 8
    Par défaut
    Citation Envoyé par millie
    Ton cast est bizarre, essaye juste ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    thread_create(&thread_commands, NULL, testDaemon, this);
    Même erreur (j'ai essayé plein de combinaisons possibles en fait, dont celle là )

  6. #6
    Rédacteur

    Avatar de millie
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    7 015
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 7 015
    Par défaut
    Bon, je suis pas trop un spécialiste de ça, d'après ce que j'ai lu, il y en a qui ont des problèmes avec pthread en C++ et utilisent plutôt boost.thread ou Qthread.

    Alors, comme je n'ai rien pour tester sous la main, essaye ces codes ci :

    Compile avec gcc.

    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
    #include <stdio.h>
     
    #include <pthread.h>
     
    static void *task_a (void *p_data)
    {
       puts ("Hello world A");
     
       (void) p_data;
       return NULL;
    }
     
    static void *task_b (void *p_data)
    {
       puts ("Hello world B");
     
       (void) p_data;
       return NULL;
    }
     
    int main (void)
    {
       pthread_t ta;
       pthread_t tb;
     
       puts ("main init");
     
       pthread_create (&ta, NULL, task_a, NULL);
       pthread_create (&tb, NULL, task_b, NULL);
     
       puts ("main end");
     
       return 0;
    }
    Et (compile avec g++) :
    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
    #include <cstdio>
     
    #include <pthread.h>
     
    static void *task_a (void *p_data)
    {
       puts ("Hello world A");
     
       (void) p_data;
       return NULL;
    }
     
    static void *task_b (void *p_data)
    {
       puts ("Hello world B");
     
       (void) p_data;
       return NULL;
    }
     
    int main (void)
    {
       pthread_t ta;
       pthread_t tb;
     
       puts ("main init");
     
       pthread_create (&ta, NULL, task_a, NULL);
       pthread_create (&tb, NULL, task_b, NULL);
     
       puts ("main end");
     
       return 0;
    }
    Etant donné qu'il y a une différence avec le void* en C++ et en C+, je pensais que le problème venait de là.

  7. #7
    Membre expérimenté
    Avatar de David Fleury
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    253
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2004
    Messages : 253
    Par défaut
    undefined reference...
    c'est plutôt une erreur de link.

    as-tu mis -lpthread dans ta ligne de commande ?
    ex:
    g++ -O3 -D_REENTRANT ton_source.cpp -lpthread

    donc d'après ton premier message oui...
    il faudrait vérifier s'il faut les extern "C" autour de ton include <pthread.h>
    (genre ifdef _cpluplus....)

  8. #8
    Rédacteur

    Avatar de millie
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    7 015
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 7 015
    Par défaut
    Citation Envoyé par Hylvenir
    c'est plutôt une erreur de link.

    Effectivement, je pensais qu'il avait au moins mis l'option de compilation pour lier avec la bibliothèque.

    En fait, je pensais à une erreur comme ça :

    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
     
    void* f(void* i)
    {
     return i;
    }
     
    int main()
    {
        int*j;
     
        int i = 2;
        j = f(&i);
     
     return 0;
    }
    Mais ça ne fournit pas l'erreur : Undefined Reference Autant pour moi

    donc d'après ton premier message oui...
    il faudrait vérifier s'il faut les extern "C" autour de ton include <pthread.h>
    (genre ifdef _cpluplus....)

    D'après le premier message, il a juste inclue l'entête, il s'est trompé de terme. Et il n'a donc peut-être pas lié

  9. #9
    Membre du Club
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Décembre 2006
    Messages : 8
    Par défaut
    Ouahahaaaa hum j'avais oublié effectivement -lpthread

    Vous pouvez me jetter de la caillasse Mais pas des trop pointues, je débute donc rame pas mal avec mes makefile & co.

    En tout cas ca à l'air de fonctionner maintenant.

    Merci beaucoup tout les deux !

  10. #10
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Par défaut
    Pense à cliquer sur

  11. #11
    Membre du Club
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Décembre 2006
    Messages : 8
    Par défaut
    Okaye,

    Juste une petite question completement off-topic (déjà que le problème l'est aussi, en fait, désolé )

    Avec g++ le petit -l indique au compilateur qu'il doit rechercher les fichiers headers dans ce dossier. Comment se fait-il que pour certains headers on ne doit pas le faire et pour d'autres oui ? (question de béhotien j'imagine)

  12. #12
    Rédacteur

    Avatar de millie
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    7 015
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 7 015
    Par défaut
    L'option -l indique qu'il doit lier avec une bibliothèque (fichier .a sous linux).

    Par exemple, -lmalib va lier avec le fichier libmalib.a (qui se trouve dans /usr/lib sous linux il me semble et dans le dossier spécifier sous windows).

    Une bibliothèque, c'est juste en gros un ensemble de fichier objet .o regroupé ensemble. On fournit en général la bibliothèque (le fichier .a) et les fichiers d'entêtes (les fichiers .h (qui se trouvent dans /usr/include/ où autres dossiers spécifié) qui contiennent la définition des prototypes, des structures, des types, des classes.)

  13. #13
    Membre du Club
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Décembre 2006
    Messages : 8
    Par défaut
    Oki,

    Mais pourquoi ne doit dont pas le faire avec, par exemple, unistd.h ? (enfin p-e que je me trompe)

  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
    Par défaut
    Pourrais-tu m'expliquer pourquoi tu choisis d'éviter boost pour utiliser à la place une API C avec moins de fonctionnalités, moins pratique, dangereuse car non type-safe, et bien sûr non exception-safe ?

  15. #15
    Membre du Club
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Décembre 2006
    Messages : 8
    Par défaut
    Citation Envoyé par loufoque
    Pourrais-tu m'expliquer pourquoi tu choisis d'éviter boost pour utiliser à la place une API C avec moins de fonctionnalités, moins pratique, dangereuse car non type-safe, et bien sûr non exception-safe ?
    J'essaye de faire un programme compact qui ne nécessite pas 13mo de librairies supplémentaires, mais sinon il est clair que je devrais creuser un peu Boost ... Question de temps, aussi ! Je suis à la bourre

  16. #16
    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
    Par défaut
    Je doute fort que boost.thread nécessite 13 Mo...

  17. #17
    Membre averti
    Profil pro
    Inscrit en
    Novembre 2005
    Messages
    44
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2005
    Messages : 44
    Par défaut
    J'en doute aussi.
    Sinon je ne pense pas que tu vas gagner du temps à prendre une bibliothèque faite en C.

    boost.thread est bien faite et assez simple.

  18. #18
    Membre du Club
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Décembre 2006
    Messages : 8
    Par défaut
    Mhh vous m'avez convaincu, je ferai qqchose de joli avec Boost, ca plaira au prof en plus

  19. #19
    Rédacteur

    Avatar de millie
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    7 015
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 7 015
    Par défaut
    Citation Envoyé par rbcmax
    Oki,

    Mais pourquoi ne doit dont pas le faire avec, par exemple, unistd.h ? (enfin p-e que je me trompe)

    Il n'y a pas besoin d'inclure les bibliothèques (avec l'option -l) pour les bibliothèques standards de fonctions (c'est à dire : stdio, stdlib, unistd... en gros, là ou il y a std dedans).

    Parfois, il peut ne pas avoir besoin de lier pour d'autres bibliothèques (cas très rare). Je pense notamment à la bibliothèque mathématiques : (-lm). Chez moi, je n'ai pas besoin de lier, mais sur des systèmes Solaris, j'étais obligé.

    Peut-être que quelqu'un d'autre pourra plus précisé la réponse

    EDIT : Sur le coup, je pensais qu'on était en C, alors il faut changer ma version en ajoutant les bibliothèques standards C++ (iostream) et remplacer truc.h par ctruc (stdlib.h => cstdlib). Et ajouter les objets dont l'espace de nom est std (std::stack...)

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

Discussions similaires

  1. Sérialisation en binaire (sans Boost)
    Par fleorock24 dans le forum C++
    Réponses: 7
    Dernier message: 10/06/2009, 08h51
  2. [Thread] [synchronised] utilisation sans thread
    Par philippe13 dans le forum AWT/Swing
    Réponses: 8
    Dernier message: 01/03/2007, 09h25
  3. Sérialisation d'objets sans Boost
    Par Alp dans le forum Boost
    Réponses: 7
    Dernier message: 24/09/2006, 11h43
  4. Boost et les Threads
    Par TuRn3r dans le forum Bibliothèques
    Réponses: 6
    Dernier message: 10/05/2006, 10h50
  5. [Thread]Boucle infinie sans 99% du proc
    Par dinver dans le forum Entrée/Sortie
    Réponses: 2
    Dernier message: 18/12/2005, 17h15

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