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 :

Problème de pile lors de l'exécution de threads


Sujet :

Linux

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Novembre 2008
    Messages
    40
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2008
    Messages : 40
    Points : 27
    Points
    27
    Par défaut Problème de pile lors de l'exécution de threads
    Bonjour

    Bonjour


    J'étais en train de m'informer pour la mise en place de threads sous
    Linux. J'ai commencé par apprendre avec le tutoriel en anglais qui est
    sur ce site : http://www.advancedlinuxprogramming.com/

    Je suis arrivé à la gestion et la réservation des données par threads
    avec la fonction pthread_key_create

    J'ai compilé la source en rapport (Per-Thread Log Files Implemented with
    Thread-Specific Data) et lorsque je l'éxécute j'ai une erreur de pile
    lors de la sortie de la fonction thread_function.
    Voici le 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
     
    #include <malloc.h>
    #include <pthread.h>
    #include <stdio.h>
    /* The key used to associate a log file pointer with each thread.  */
    static pthread_key_t thread_log_key;
    /* Write MESSAGE to the log file for the current thread.  */
    void write_to_thread_log (const char* message)
    {
      FILE* thread_log = (FILE*) pthread_getspecific (thread_log_key);
      fprintf (thread_log, “%s\n”, message);
    }
    /* Close the log file pointer THREAD_LOG.  */
    void close_thread_log (void* thread_log)
    {
      fclose ((FILE*) thread_log);
    }
    void* thread_function (void* args)
    {
      char thread_log_filename[20];
      FILE* thread_log;
      /* Generate the filename for this thread’s log file. */
      sprintf (thread_log_filename, “thread%d.log”, (int) pthread_self ());
      /* Open the log file. */
      thread_log = fopen (thread_log_filename, “w);
      /* Store the file pointer in thread-specific data under thread_log_key. */
      pthread_setspecific (thread_log_key, thread_log);
      write_to_thread_log (“Thread starting.”);
      /* Do work here... */
      return NULL;
    }
    int main ()
    {
      int i;
      pthread_t threads[5];
      /* Create a key to associate thread log file pointers in
         thread-specific data. Use close_thread_log to clean up the file
         pointers. */
      pthread_key_create (&thread_log_key, close_thread_log);
      /* Create threads to do the work. */
      for (i = 0; i < 5; ++i)
        pthread_create (&(threads[i]), NULL, thread_function, NULL);
      /* Wait for all threads to finish. */
      for (i = 0; i < 5; ++i)
        pthread_join (threads[i], NULL);
      return 0;
    }
    J'ai vu que vous avez fait un résumé de ce tutoriel à cette adresse : http://mtodorovic.developpez.com/lin...=page_4#L4-2-2.

    Est-ce que quelqu'un pourrai le compiler ?
    Pourriez vous me dire pourquoi j'ai ce problème?


    D'avance Merci

    Lann

  2. #2
    Membre émérite Avatar de nicolas.sitbon
    Profil pro
    Inscrit en
    Août 2007
    Messages
    2 015
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 2 015
    Points : 2 280
    Points
    2 280
    Par défaut
    tu castes un type qui peu potentiellement être une structure en int (pthread_t) ceux qui n'a aucun sens en plus. D'autre part je ne sais pas quel encodage tu as choisi mais mon petit doigt me dit que tu codes avec un éditeur genre openoffice.
    Pourquoi le nombre 5 (pour 5 threads) n 'est pas un define? pourquoi la variable i qui te permet d'itérer sur le nombre de threads est un int? tu penses avoir un nombre de thread négatif ;-) ?
    les fonctions que tu n'exportes pas doivent être statiques.
    la déclaration de main comme tu l'as fait peut amener à un comportement indéterminé.
    (void*) n'a pas besoin d'être casté, c'est le principe même du pointeur générique.
    sprintf est à proscrire.
    teste le retour de tes fonctions, en particuliers fopen.
    A quoi peut bien servir malloc.h?
    "The quieter you become, the more you are able to hear"
    "Plus vous êtes silencieux, plus vous êtes capable d'entendre"

  3. #3
    Membre émérite
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2008
    Messages
    1 515
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France

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

    Informations forums :
    Inscription : Octobre 2008
    Messages : 1 515
    Points : 2 505
    Points
    2 505
    Par défaut
    Ca tourne bien chez moi (après avoir corrigé remplacé tes guillemets par des double quotes).

  4. #4
    Membre confirmé

    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Août 2007
    Messages
    509
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux

    Informations forums :
    Inscription : Août 2007
    Messages : 509
    Points : 622
    Points
    622
    Par défaut
    Est ce que tu pourrais afficher un descriptif de ton erreur stp?

  5. #5
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Novembre 2008
    Messages
    40
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2008
    Messages : 40
    Points : 27
    Points
    27
    Par défaut
    Bonjour

    @ nicolas.sitbon

    Oui effectivement le code n'est pas parfait puisque c'est un exemple rapide pour la mise en oeuvre des threads. Je programme sous code blocks.

    @ matafan

    Intéressant que ça fonctionne chez toi. Problème de compilateur ? Celui que j'utilise est GCC 4.2

    @ publicStaticVoidMain
    voici les erreurs :
    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
     
    *** stack smashing detected ***: ./essai terminated
    ======= Backtrace: =========
    /lib/tls/i686/cmov/libc.so.6(__fortify_fail+0x48)[0xb7cd9138]
    /lib/tls/i686/cmov/libc.so.6(__fortify_fail+0x0)[0xb7cd90f0]
    ./essai[0x8048a8c]
    /lib/tls/i686/cmov/libpthread.so.0[0xb7d404fb]
    /lib/tls/i686/cmov/libc.so.6(clone+0x5e)[0xb7cc2e5e]
    ======= Memory map: ========
    08048000-08049000 r-xp 00000000 03:07 950423     /home/lann/Documents/Programmation/code_blocks/essai/bin/Debug/essai
    08049000-0804a000 rw-p 00000000 03:07 950423     /home/lann/Documents/Programmation/code_blocks/essai/bin/Debug/essai
    0804a000-0806b000 rw-p 0804a000 00:00 0          [heap]
    b73c2000-b73c3000 ---p b73c2000 00:00 0 
    b73c3000-b7bc5000 rw-p b73c3000 00:00 0 
    b7bc5000-b7beb000 r-xp 00000000 03:07 1524097    /usr/lib/libpcre.so.3.12.1
    b7beb000-b7bec000 rw-p 00026000 03:07 1524097    /usr/lib/libpcre.so.3.12.1
    b7bec000-b7d35000 r-xp 00000000 03:07 1229300    /lib/tls/i686/cmov/libc-2.7.so
    b7d35000-b7d36000 r--p 00149000 03:07 1229300    /lib/tls/i686/cmov/libc-2.7.so
    b7d36000-b7d38000 rw-p 0014a000 03:07 1229300    /lib/tls/i686/cmov/libc-2.7.so
    b7d38000-b7d3b000 rw-p b7d38000 00:00 0 
    b7d3b000-b7d4f000 r-xp 00000000 03:07 1229314    /lib/tls/i686/cmov/libpthread-2.7.so
    b7d4f000-b7d51000 rw-p 00013000 03:07 1229314    /lib/tls/i686/cmov/libpthread-2.7.so
    b7d51000-b7d54000 rw-p b7d51000 00:00 0 
    b7d54000-b7d5e000 r-xp 00000000 03:07 1214593    /lib/libgcc_s.so.1
    b7d5e000-b7d5f000 rw-p 0000a000 03:07 1214593    /lib/libgcc_s.so.1
    b7d5f000-b7d82000 r-xp 00000000 03:07 1229304    /lib/tls/i686/cmov/libm-2.7.so
    b7d82000-b7d84000 rw-p 00023000 03:07 1229304    /lib/tls/i686/cmov/libm-2.7.so
    b7d84000-b7e6c000 r-xp 00000000 03:07 1523860    /usr/lib/libstdc++.so.6.0.9
    b7e6c000-b7e6f000 r--p 000e8000 03:07 1523860    /usr/lib/libstdc++.so.6.0.9
    b7e6f000-b7e71000 rw-p 000eb000 03:07 1523860    /usr/lib/libstdc++.so.6.0.9
    b7e71000-b7e77000 rw-p b7e71000 00:00 0 
    b7e77000-b7f27000 r-xp 00000000 03:07 1526239    /usr/lib/libglib-2.0.so.0.1600.6
    b7f27000-b7f28000 rw-p 000b0000 03:07 1526239    /usr/lib/libglib-2.0.so.0.1600.6
    b7f28000-b7f2f000 r-xp 00000000 03:07 1229316    /lib/tls/i686/cmov/librt-2.7.so
    b7f2f000-b7f31000 rw-p 00006000 03:07 1229316    /lib/tls/i686/cmov/librt-2.7.so
    b7f31000-b7f35000 r-xp 00000000 03:07 1526245    /usr/lib/libgthread-2.0.so.0.1600.6
    b7f35000-b7f36000 rw-p 00003000 03:07 1526245    /usr/lib/libgthread-2.0.so.0.1600.6
    b7f36000-b7f37000 rw-p b7f36000 00:00 0 
    b7f49000-b7f4a000 rw-p b7f49000 00:00 0 
    b7f4a000-b7f4b000 r-xp b7f4a000 00:00 0          [vdso]
    b7f4b000-b7f65000 r-xp 00000000 03:07 1212522    /lib/ld-2.7.so
    b7f65000-b7f67000 rw-p 00019000 03:07 1212522    /lib/ld-2.7.so
    bfb2d000-bfb42000 rw-p bffeb000 00:00 0          [stack]
    Abandon

  6. #6
    Membre du Club Avatar de Atikae
    Profil pro
    Étudiant
    Inscrit en
    Avril 2007
    Messages
    56
    Détails du profil
    Informations personnelles :
    Âge : 31
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2007
    Messages : 56
    Points : 56
    Points
    56
    Par défaut
    Tu compiles avec quoi ? Quelles sont tes options de compilations ?

    Personellement je n'ai aucun problème pour exécuter ta source.
    Que te donne "ldd TON_BINAIRE" ?

  7. #7
    Membre émérite Avatar de nicolas.sitbon
    Profil pro
    Inscrit en
    Août 2007
    Messages
    2 015
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 2 015
    Points : 2 280
    Points
    2 280
    Par défaut
    Citation Envoyé par matafan Voir le message
    Ca tourne bien chez moi (après avoir corrigé remplacé tes guillemets par des double quotes).
    Citation Envoyé par Atikae Voir le message
    Tu compiles avec quoi ? Quelles sont tes options de compilations ?

    Personellement je n'ai aucun problème pour exécuter ta source.
    Que te donne "ldd TON_BINAIRE" ?
    Cela illustre bien les comportements indérminés, tant que le code n'est pas corrigé, inutile d'investiguer plus loin.
    "The quieter you become, the more you are able to hear"
    "Plus vous êtes silencieux, plus vous êtes capable d'entendre"

  8. #8
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Novembre 2008
    Messages
    40
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2008
    Messages : 40
    Points : 27
    Points
    27
    Par défaut
    ldd binaire donne :

    linux-gate.so.1 => (0xb7f6c000)
    libgthread-2.0.so.0 => /usr/lib/libgthread-2.0.so.0 (0xb7f52000)
    librt.so.1 => /lib/tls/i686/cmov/librt.so.1 (0xb7f49000)
    libglib-2.0.so.0 => /usr/lib/libglib-2.0.so.0 (0xb7e98000)
    libstdc++.so.6 => /usr/lib/libstdc++.so.6 (0xb7da5000)
    libm.so.6 => /lib/tls/i686/cmov/libm.so.6 (0xb7d80000)
    libgcc_s.so.1 => /lib/libgcc_s.so.1 (0xb7d75000)
    libpthread.so.0 => /lib/tls/i686/cmov/libpthread.so.0 (0xb7d5c000)
    libc.so.6 => /lib/tls/i686/cmov/libc.so.6 (0xb7c0d000)
    /lib/ld-linux.so.2 (0xb7f6d000)
    libpcre.so.3 => /usr/lib/libpcre.so.3 (0xb7be6000)

    Comme je l'ai dit plus haut, je compile avec GCC 4.2
    Pour les options, j'ai juste coché "enable all compiler warnings" [-Wall]

Discussions similaires

  1. [Dev-Pascal] [GNU Pascal] Problème d'affichage lors de l'exécution d'un programme
    Par Mourad III dans le forum Autres IDE
    Réponses: 2
    Dernier message: 03/11/2010, 02h19
  2. Problème sous XP lors de l'exécution d'un jeu
    Par dembroski dans le forum Windows XP
    Réponses: 3
    Dernier message: 28/01/2010, 10h43
  3. Problème de droit lors de l'exécution du script
    Par lemirandais dans le forum Ubuntu
    Réponses: 2
    Dernier message: 26/11/2008, 22h46
  4. Réponses: 3
    Dernier message: 01/02/2008, 13h42
  5. Réponses: 8
    Dernier message: 17/09/2007, 20h16

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