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

Linux Discussion :

PThread et Linux


Sujet :

Linux

  1. #1
    Nouveau membre du Club
    Profil pro
    Étudiant
    Inscrit en
    Avril 2005
    Messages
    60
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2005
    Messages : 60
    Points : 33
    Points
    33
    Par défaut PThread et Linux
    Bonjour a tous, voilà dans le cadre de mon projet de fin d'année de BTS, je dois mettre en place les threads une carte ColdFire sous uClinux (noyau de linux pour les systemes embarqué).
    Jusque là pas de probleme, seulement lors de la compilation de mon programme (exemple trouvé sur internet), j'obtien une erreur de type : undefined reference to `__rpc_thread_destroy'

    Je n'ai aucune idée d'ou l'erreur peut venir.

    Je developpe sous Linux Red Hat 9 avec Eclipse.

    J'espere que vous pourrez m'eclairer la dessus, merci d'avance.

    voici le-dit code
    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
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
     
     #include <stdio.h>
     #include <stdlib.h>
     #include <pthread.h>
     #include <unistd.h>    // pour sleep
     #include <stdio.h>
     #include <stdlib.h>
     #include <pthread.h>
     
     
     // mutex => MUtuelle EXclusion (permet d'éviter un accès simultané à une variable)
     static pthread_mutex_t mutex;
     static int tab[5];
     
     
     void* threadLectureTableau(void* arg)
     {
         for (int i = 0 ; i != 5 ; i++)
         {
             // blocage du mutex
             // (attente éventuelle de sa libération s'il est déjà bloqué)
             pthread_mutex_lock (&mutex);
     
             printf ("Lecture du tableau 1 : tab[%d] vaut %d\\n", i, tab[i]);
     
             // déblocage du mutex
             pthread_mutex_unlock (&mutex);
     
             sleep(1);
         }
     
         pthread_exit (0);
     }
     
     
     void* threadLectureTableau2(void* arg)
     {
         for (int i = 0 ; i != 5 ; i++)
         {
             // blocage du mutex
             // (attente éventuelle de sa libération s'il est déjà bloqué)
             pthread_mutex_lock (&mutex);
     
             printf ("Lecture du tableau 2 : tab[%d] vaut %d\\n", i, tab[i]);
     
             // déblocage du mutex
             pthread_mutex_unlock (&mutex);
     
             sleep(2);
         }
              pthread_exit (0);
     }
     
     
     void* threadEcritureTableau(void* arg)
     {
         // blocage du mutex
         // (attente éventuelle de sa libération s'il est déjà bloqué)
         pthread_mutex_lock (&mutex);
     
         for (int i = 0 ; i != 5 ; i++)
         {
             tab[i] = 2 * i;
             printf ("Ecriture du tableau : tab[%d] vaut %d\\n", i, tab[i]);
             sleep(1);
         }
     
         // déblocage du mutex
         pthread_mutex_unlock (&mutex);
     
         pthread_exit (0);
     }  
     
     int main(int argc, char *argv[])
     {
         pthread_t thread1, thread2, thread3;
         void *retour;
     
         pthread_mutex_init (&mutex, NULL);
     
         if (pthread_create (&thread1, NULL, threadEcritureTableau, NULL) < 0)
         {
             fprintf (stderr, "Impossible de créer le thread 1\\n");
             exit (1);
         }
         if (pthread_create (&thread2, NULL, threadLectureTableau, NULL) < 0)
         {
             fprintf (stderr, "Impossible de créer le thread 2\\n");
             exit (1);
         }
         if (pthread_create (&thread3, NULL, threadLectureTableau2, NULL) < 0)
         {
             fprintf (stderr, "Impossible de créer le thread 2\\n");
             exit (1);
         }
                     // le processus principale est ainsi contraint d'attendre la fin d'exécution
                     // des threads fils
         (void)pthread_join (thread1, &retour);
         (void)pthread_join (thread2, &retour);
         (void)pthread_join (thread3, &retour);
    }

  2. #2
    Expert éminent
    Avatar de Swoög
    Profil pro
    Inscrit en
    Janvier 2003
    Messages
    6 045
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France

    Informations forums :
    Inscription : Janvier 2003
    Messages : 6 045
    Points : 8 339
    Points
    8 339
    Par défaut
    au moment de la compilation, il faut linker la librairie avec -lpthread

  3. #3
    Nouveau membre du Club
    Profil pro
    Étudiant
    Inscrit en
    Avril 2005
    Messages
    60
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2005
    Messages : 60
    Points : 33
    Points
    33
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    make -k all 
    m68k-elf-g++ -m5307 -DCONFIG_COLDFIRE -Os -g -fomit-frame-pointer -m5307 -DCONFIG_COLDFIRE  -Dlinux -D__linux__ -Dunix -D__uClinux__ -DEMBED -I/home/uClinux-dist/lib/uClibc/include -I/home/uClinux-dist/lib/libm -I/home/uClinux-dist/lib/libcrypt_old -I/home/uClinux-dist -fno-builtin -msep-data -I/home/uClinux-dist//include  -fno-exceptions   -c -o thread.o thread.cpp
    m68k-elf-g++ -m5307 -DCONFIG_COLDFIRE -Os -g -fomit-frame-pointer -m5307 -DCONFIG_COLDFIRE  -Dlinux -D__linux__ -Dunix -D__uClinux__ -DEMBED -I/home/uClinux-dist/lib/uClibc/include -I/home/uClinux-dist/lib/libm -I/home/uClinux-dist/lib/libcrypt_old -I/home/uClinux-dist -fno-builtin -msep-data -I/home/uClinux-dist//include  -fno-exceptions -Os -g -fomit-frame-pointer -m5307 -DCONFIG_COLDFIRE  -Dlinux -D__linux__ -Dunix -D__uClinux__ -DEMBED -I/home/uClinux-dist/lib/uClibc/include -I/home/uClinux-dist/lib/libm -I/home/uClinux-dist/lib/libcrypt_old -I/home/uClinux-dist -fno-builtin -msep-data -I/home/uClinux-dist//include -Wl,-elf2flt -Wl,-move-rodata -nostartfiles /home/uClinux-dist/lib/uClibc/lib/crt0.o -L/home/uClinux-dist/lib/uClibc/. -L/home/uClinux-dist/lib/uClibc/lib -L/home/uClinux-dist/lib/libm -L/home/uClinux-dist/lib/libnet -L/home/uClinux-dist/lib/libdes -L/home/uClinux-dist/lib/libaes -L/home/uClinux-dist/lib/libpcap -L/home/uClinux-dist/lib/libssl -L/home/uClinux-dist/lib/libcrypt_old -L/home/uClinux-dist/prop/libsnapgear++ -L/home/uClinux-dist/prop/libsnapgear -L/home/uClinux-dist/lib/zlib -o thread thread.o -lpthread -lstdc++ -liberty -lc -lgcc
    thread.elf2flt: In function `main':
    /home/exe_uClinux/thread/thread.cpp:104: undefined reference to `__rpc_thread_destroy'
    collect2: ld returned 1 exit status
    make: *** [thread] Erreur 1
    make: La cible `all' n'a pas pu être refabriquée à cause d'erreurs.
    merci de ta rapide réponse mais elle est bien linker avec le lpthread....

  4. #4
    Expert éminent
    Avatar de Swoög
    Profil pro
    Inscrit en
    Janvier 2003
    Messages
    6 045
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France

    Informations forums :
    Inscription : Janvier 2003
    Messages : 6 045
    Points : 8 339
    Points
    8 339
    Par défaut
    C'est laquelle la ligne qui cause ton erreur

  5. #5
    Nouveau membre du Club
    Profil pro
    Étudiant
    Inscrit en
    Avril 2005
    Messages
    60
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2005
    Messages : 60
    Points : 33
    Points
    33
    Par défaut
    c'est la ligne 104 d'apres la console de d'eclipse, et sur mon code (1er post) ca correspond a l'accolade fermé du main, autant dire que c louche

  6. #6
    Nouveau membre du Club
    Profil pro
    Étudiant
    Inscrit en
    Avril 2005
    Messages
    60
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2005
    Messages : 60
    Points : 33
    Points
    33
    Par défaut
    alors personne à de reponse a mon probleme, parceque c'est quand meme bizard d'avoir une erreur sur une accolade et j'avoue que j'ai eu beau recopier le code plusieurs fois et ca fait toujours la meme chose...

  7. #7
    Membre confirmé
    Profil pro
    Inscrit en
    Novembre 2003
    Messages
    394
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2003
    Messages : 394
    Points : 473
    Points
    473
    Par défaut
    Ce n'est pas bizarre d'avoir un erreur sur une fin de bloc, cela arrive fréquemment. La cause de ton problème est facile à voir. Une fonction est manquante à l'édition de lien, la fameuse '__rpc_thread_destroy'.
    Elle est sûrement appelée par un des destructeurs des objets que tu crées dans le main.
    Ou bien mise dans la pile des fonctions à exécuter en fin de programme via un atexit() ou autre.
    Pourquoi cette fonction n'est pas disponible ? Aucune idée.
    Existe-t-elle pour la plate-forme que tu utilises ? Les bibliothèques que tu utilises ont-elles été compilées avec les bonnes options pour supporter le multitache ? Ne faut-il simplement pas un flag supplémentaire lors de la compilation ?
    Voilà quelques pistes que je regarderais à grand coup de google.

  8. #8
    Nouveau membre du Club
    Profil pro
    Étudiant
    Inscrit en
    Avril 2005
    Messages
    60
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2005
    Messages : 60
    Points : 33
    Points
    33
    Par défaut
    On est plusieurs sur des projets différents avec la meme plateform et les meme options de compilation, mais je suis le seul a avoir ce probleme, les librairie d'uClibc on bien été compiler pour supporter le multithread.

    Je vais continuer de plancher la dessus, merci de vos conseil

  9. #9
    Rédacteur

    Avatar de Matthieu Brucher
    Profil pro
    Développeur HPC
    Inscrit en
    Juillet 2005
    Messages
    9 810
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Développeur HPC
    Secteur : Industrie

    Informations forums :
    Inscription : Juillet 2005
    Messages : 9 810
    Points : 20 970
    Points
    20 970
    Par défaut
    Si tu es le seul à ne pas pouvoir compiler ton programme, c'est que tu as un soucis chez toi Regarde la différence - ou les différences - de config entre toi et tes collègues.

  10. #10
    Membre confirmé
    Profil pro
    Inscrit en
    Novembre 2003
    Messages
    394
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2003
    Messages : 394
    Points : 473
    Points
    473
    Par défaut
    En regardant vite fait sur Google, visiblement tu n'es pas le seul à avoir eu ce pb.
    De ce que j'en vois pour eux c'était dû au fait que la uClibc n'était pas compilé avec le support multitâche.
    Un flag est mentionné UCLIBC_HAS_THREADS.

  11. #11
    Nouveau membre du Club
    Profil pro
    Étudiant
    Inscrit en
    Avril 2005
    Messages
    60
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2005
    Messages : 60
    Points : 33
    Points
    33
    Par défaut
    effectivement j'ai le flag UCLIBC_HAS_THREADS is not set...pourtant quand je fais un make menuconfig, j'ai bien selectionné le POSIX Thread...en tout cas merci pour ton votre aide, ca m'enleve une épine du pied

  12. #12
    Membre confirmé
    Profil pro
    Inscrit en
    Novembre 2003
    Messages
    394
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2003
    Messages : 394
    Points : 473
    Points
    473
    Par défaut
    De rien.
    Un conseil pour la suite, si tu n'es pas trop rebuté par l'anglais, généralement un copier/collée du message d'erreur gcc dans google donne un bon début de réponse.
    En l'occurence, c'est ainsi que j'ai procédé alors que je ne connais abolument rien à uclinux

  13. #13
    Nouveau membre du Club
    Profil pro
    Étudiant
    Inscrit en
    Avril 2005
    Messages
    60
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2005
    Messages : 60
    Points : 33
    Points
    33
    Par défaut
    merci du conseil

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

Discussions similaires

  1. [socket-pthread-linux]printf non executé
    Par sebatlante dans le forum C
    Réponses: 4
    Dernier message: 11/04/2011, 12h34
  2. Performance de pthread sous linux
    Par uriotcea dans le forum C
    Réponses: 5
    Dernier message: 05/08/2009, 19h17
  3. Terminer l'execution des pthreads [c/linux]
    Par Marc san dans le forum C
    Réponses: 4
    Dernier message: 26/02/2006, 23h15
  4. Réponses: 4
    Dernier message: 27/08/2003, 22h34
  5. Je ne peux établir une connexion cliente sous Linux.
    Par Anonymous dans le forum CORBA
    Réponses: 5
    Dernier message: 16/04/2002, 16h57

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