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 cadencement de 2 threads en C sous linux


Sujet :

Linux

  1. #1
    Candidat au Club
    Inscrit en
    Février 2011
    Messages
    3
    Détails du profil
    Informations forums :
    Inscription : Février 2011
    Messages : 3
    Points : 4
    Points
    4
    Par défaut problème de cadencement de 2 threads en C sous linux
    Bonsoir

    je lis actuellement le chapitre 4 de ALP pour linux , ça concerne les threads , j'ai repris le code sur les nombres premiers , j'ai essayé d'ajouter un 2 ièm thread pour la recherche de premier , mais je n'arrive pas à placer mes instructions de mutex dans le bloc donc il ne se cadence pas comme il faut , sachant que 1 des 2 thread doit me renvoyer le Nième premiers et rendre le terminal derrière. Cependant quand je compile le code , le second thread n'est pas visible par les printf() , le code ne se termine pas comme il faudrait .

    merci pour vos remarques .

    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
     
     
    #define _REENTRANT
     
    #include <stdio.h>
    #include <stdlib.h>
    // pthread
    #include <pthread.h>
     
     
     
    static int candidate = 3 ;
    static int n = 10 ;    /* le 10 iem premier c'est 29 */
     
    static pthread_mutex_t mtx = PTHREAD_MUTEX_INITIALIZER;
     
     
     
    void * threadfunc ()
    {
    pthread_mutex_lock (&mtx);
    while (1) {
     
     
    int factor ;
    int is_prime = 1 ;
     
     
     
    for (factor = 2 ; factor * factor <= candidate ; ++factor)  /* optimisation des diviseurs */
     
       if ( candidate % factor == 0 )
            {
            is_prime = 0 ;
            break ;
            }
    printf("thread_id %lu\n" ,pthread_self());
     
    if (is_prime)
        {
     
            if (--n - 1 == 0)
            {
                printf(" %lu\t",pthread_self());
                return (void *)candidate  ;
                pthread_exit (0) ;
            }
        }
     
    candidate += 2 ;
    printf("candi %d & thread %lu\n" , candidate , pthread_self()); // on vise que les nombres impairs après 2
     
             }
     
    pthread_exit (0) ;
    pthread_mutex_unlock (&mtx);
    }
     
     
     
    int main (int argc , char * argv [] ) {
     
     
    int s ;
    pthread_t thread1;
    pthread_t thread2;
     
     
    if ((s = pthread_create ( &thread1, NULL , threadfunc , NULL)) !=0 )
            printf("error tread 1 \n");
     
    if ((s = pthread_create ( &thread2, NULL , threadfunc , NULL)) !=0 )
            printf("error tread 2 \n");
     
     
     
    if (( s = pthread_join ( thread1 , (void *) &candidate )) !=0 )
            printf("error join 1 \n");
     
     
     
    if (( s = pthread_join ( thread2 , (void *) &candidate )) !=0 )
           printf("error join 2 \n");
     
     
    printf("le nieme premier %d\n" , candidate ) ;
     
     
     
     
    return (0) ;
    }

  2. #2
    Expert confirmé
    Avatar de gerald3d
    Homme Profil pro
    Conducteur de train
    Inscrit en
    Février 2008
    Messages
    2 291
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Conducteur de train
    Secteur : Transports

    Informations forums :
    Inscription : Février 2008
    Messages : 2 291
    Points : 4 941
    Points
    4 941
    Billets dans le blog
    5
    Par défaut
    Bonsoir.

    Je n'ai pas regardé l'enchainement des différents threads. Je veux juste apporter une petite remarque sur la fonction printf();. Il arrive parfois que son affichage soit reporté voir carrément "oublié".
    La première chose à faire et de s'assurer que tu fais bien un retour chariot à chaque affichage. Ca force un peu le système. Mais ce n'est pas suffisant.
    Pour ma part, lorsque j'utilise printf(); pour du déboguage je passe plutôt par la fonction fprintf(); et j'utilise le canal d'erreur. L'affichage est alors prioritaire. Ca m'évite de me dire que les choses ne se font pas dans l'ordre.
    Exemple:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    fprintf(stderr, "Hello World\n");
    Je ne sais pas si ca va résoudre quoi que ce soit à ton problème mais on ne sait jamais...

Discussions similaires

  1. Réponses: 3
    Dernier message: 06/05/2011, 13h36
  2. Communication inter-threads par stdout sous linux
    Par millerf dans le forum Concurrence et multi-thread
    Réponses: 8
    Dernier message: 17/07/2007, 11h28
  3. communication inter-thread en c sous linux
    Par splinternabs dans le forum POSIX
    Réponses: 17
    Dernier message: 22/02/2006, 09h34
  4. [Thread][socket]Problème de fermeture d'un thread
    Par meda dans le forum Concurrence et multi-thread
    Réponses: 4
    Dernier message: 04/11/2004, 01h03
  5. Problème de creation de thread sous linux
    Par xilebo dans le forum POSIX
    Réponses: 4
    Dernier message: 27/10/2004, 09h58

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