pthread
Répondre à la discussion
Affichage des résultats 1 à 13 sur 13

pthread



  1. #1
    invitef8fdcbb2

    pthread


    ------

    bonjour,
    j'ai un problemme evec la compilation d'un programme C sous linux, c'est un programme un programme des threads coopératifs qui sert à créer 2 threads et affecter chacun d'eux à un core différent en utilisant la routine pthread_setaffinity_np et pthread_getaffinity_np pour déterminer les paramètres des threads en cours d'exécution; mais cette partie ne fonctionne pas dans de programme, en fait je pense que toute la derniere partie du conne ne fonctionne pas.
    voila se qu'il m'affiche lors de l'execution:

    Le systeme à 8 processors.

    *L'identificateur du processus main thread est: 4363
    thread 0 affinity utilise pthread_setaffinity_np en binaire :* 100 en Hex :00000004 *
    thread 0 affinity using pthread_getaffinity_np en binaire : 100 en Hex :00000004
    *
    Segmentation fault (core dumped)



    et voila le code:
    Code:
    #include<stdio.h>
    #include<stdlib.h>
    #include<pthread.h>
    #include<sys/syscall.h>
    #include<string.h>
    #include<unistd.h>
    #include<math.h>
    #include<time.h>
    
    #define mask1 4
    #define mask2 8
    #define nbr_threads 2
    #define N 10
    
    void *thread_body_function( void *threadid );
    void dec2bin( unsigned long decimal, char *binary );
    double waste_time( long n );
    pid_t gettid( void );
     /* Les variables globales doivent etre déclarées avant main() */
    
    pthread_mutex_t mutextab;
    
    int tab[N];
    int k;
    main(  )
    {
     unsigned long decimal[nbr_threads];
     unsigned long mask_thread[nbr_threads];
     unsigned int lenmask_thread[nbr_threads];
     pthread_attr_t attr;
     clock_t start, end;
     double cpu_time_used;
    
     char binary[80];
    
     pthread_t threads[nbr_threads];
    
     int ret[nbr_threads]; /* contient les resultats de pthread_create */
     int i;
     long t;
    
     system( "clear" );
    
     /* determination du nombre de processeur actuel */
    
     int NUM_PROCS = sysconf( _SC_NPROCESSORS_CONF );
     printf( "\n Le systeme à %i processors. \n", NUM_PROCS );
     printf( "\n L'identificateur du processus main thread est: %d \n", getpid(  ) );
    
     // int r=10;
     start = clock();
    
     /* Creation des threads coopératifs sur la fonction thread_body_function */
    
     t = 0;
     while ( t < nbr_threads )
        {
    
                ret[t] = pthread_create( &threads[t], NULL, thread_body_function, ( void * )t );
     switch ( t )
     {
      case 0: /* thread # 1 */
       {
        decimal[t] = mask1;
        mask_thread[t] = mask1; /* Les processeurs definis en mask1 ex 3= 0,1 */
        break;
       }
      case 1: /* thread #2 */
       {
        decimal[t] = mask2;
        mask_thread[t] = mask2;
        break;
        }
      default: /* sinon */
        {
        decimal[t] = 1;
        mask_thread[t] = pow( 2, NUM_PROCS )-1;
        }
      }
            lenmask_thread[t] = sizeof( mask_thread[t] );
    
            if ( ret[t] == 0 )
      {
          /* =======settig Thread scheduling affinity ======== */
    
              if ( pthread_setaffinity_np ( threads[t], lenmask_thread[t], &mask_thread[t] ) < 0 )
    
              {  
        perror( "pthread_setaffinity_np" );
       }
       else
       {
        decimal[t] = mask_thread[t];
        dec2bin( decimal[t], binary );
        printf ( "thread %ld affinity utilise pthread_setaffinity_np en binaire : %s en Hex :%08lx  \n",
    t, binary, mask_thread[t] );
              }
    
        /* =======getting thread scheduling affinity ======== */
    
       if ( pthread_getaffinity_np ( threads[t], lenmask_thread[t], &mask_thread[t] ) < 0 )
       {
        perror( "pthread_getaffinity_np" );
       }
       else
       {
        decimal[t] = mask_thread[t];
               dec2bin( decimal[t], binary );
        printf( "thread %ld affinity using pthread_getaffinity_np en binaire :%s en Hex :%08lx \n \n",
    t, binary, mask_thread[t] );
              }
       }
    /*============================================================================*/
             else
       {
        printf( "thread %li n'est pas créé \n", t );
       }
        t = t + 1;
      }
    
      t = 0;
      while ( t < nbr_threads )
       {
        pthread_join( threads[t], NULL );
        t = t + 1;
       }
    
      end = clock();
      cpu_time_used = ( (double)(end-start) / CLOCKS_PER_SEC );
      printf( "Le temps CPU utilisé par ce programme est: %f\n", cpu_time_used );
      exit(0);
            }
    
            /*=========Definition de la fonction============*/
            /* Cette fonction renvoie l'identificateur du thread appelé */
            pid_t gettid( void )
            {
      return syscall( __NR_gettid );
            }
    
            /* la fontion sur laquelle les threads sont créé */
            void *thread_body_function( void *threadid )
            {
    
      long tid;
      tid = *(long*)threadid;
      int j;
      int i;
      int tab1[N];
    
      printf( "\n" );
      printf( "le thread # %ld est créé \n", tid );
      printf( "L'identificateur du thread %ld est : %d \n",*(long*)threadid, ( int )gettid() );
    
      /*  Consomation du temps afin que le fonctionnement des threads soit visible */
    
      printf( "Le temps consommé par thread %ld est : %f\n", *( long * )threadid,
    waste_time(2000) );
    
      for ( i=0; i<N; i++ )
       {
        tab[i] = 25;
        printf( "tab[%d]=%d le tableau d'init \n", i, tab[i] );
       }
    
     for ( i=0;i<N;i++ )
       {
        pthread_mutex_lock( &mutextab );
        for (j=0; j<N; j++)
         {
          tab1[j] = tab[i];
          printf( "tab[%d]=%d  thread n %ld  \n", j, tab1[j], tid );
         }
        pthread_mutex_unlock( &mutextab );
        pthread_exit( ( void * )0 );
        }
               }
    
            double waste_time( long n )
             {
       double res = 0;
       long i = 0;
       while ( i < n * 200000 )
        {
         i++;
         res += sqrt(i);
         res = 10;
        }
        return res;
             }
    
           /*  conversion from decimal to binary */
           void dec2bin( unsigned long decimal, char *binary )
           {
     int k = 0, n = 0;
     int remain;
     unsigned long old_decimal;
     char temp[80];
    
     do
     {
             old_decimal = decimal; // for test
      remain = decimal % 2;
             decimal = decimal / 2;
             temp[k++] = remain + '0';
            }
    
     while ( decimal > 0 ); 
     temp[k++] = ' ';
     /* space */ 
    
     /* reverse the spelling */
    
     while ( k >= 0 )
      binary[n++] = temp[--k];
     binary[n - 1] = 0; // end with NULL
          }

    -----
    Dernière modification par Jack ; 11/03/2016 à 14h07. Motif: Balises code

  2. #2
    Jack
    Modérateur

    Re : pthread

    Merci de lire les règles participatives de ce forum et de penser à utiliser les balises code

  3. #3
    invitef8fdcbb2

    Re : pthread

    ok merci

  4. #4
    pm42

    Re : pthread

    Citation Envoyé par sysunic Voir le message
    Segmentation fault (core dumped)
    Peut-être que quand j'étais jeune, j'aurais eu le courage de lire une fonction main multithreadé de 200 lignes pour comprendre pourquoi elle fait "core dumped". Mais même là, je pense que j'aurais expliqué au programmeur qu'il est utilise de découper son code en fonctions.
    Sinon, as tu essayé sous débugger pour savoir exactement où ton code se plante ?

  5. A voir en vidéo sur Futura
  6. #5
    invite473b01b1

    Re : pthread

    Je pense que le problème vient du fait que votre mutex n'est pas initialisé...

    Vous pouvez l'initialiser de façon statique ou dynamique:

    Initialisation statique:

    Code:
    pthread_mutex_t lock = PTHREAD_MUTEX_INITIALIZER;
    Initialisation dynamique:

    Code:
    pthread_mutex_t lock;
    
    int main()
    {
         pthread_mutex_init ( &lock, NULL);
         ...
    }
    Cela dit, je ne vois pas d'intérêt d'utiliser un mutex ici...

    Ensuite, à moins que ce ne soit volontaire dans le cadre de votre test, le pthread_exit() dans la méthode thread_body_function me semble mal placè et la première boucle ne s’exécutera donc qu'une seule fois:

    Code:
    	for (i = 0; i<N; i++)
    	{
    		pthread_mutex_lock(&mutextab);
    		for (j = 0; j<N; j++)
    		{
    			tab1[j] = tab[i];
    			printf("tab[%d]=%d  thread n %ld  \n", j, tab1[j], tid);
    		}
    		pthread_mutex_unlock(&mutextab);
    		pthread_exit((void *)0);
    	}

  7. #6
    invite473b01b1

    Re : pthread

    Citation Envoyé par pm42 Voir le message
    Mais même là, je pense que j'aurais expliqué au programmeur qu'il est utilise de découper son code en fonctions.
    Il l'a plutôt bien fait, on pourrait faire mieux mais ça me semble correct, le problème vient de l'indentation et la non coloration syntaxique dans ce forum, une fois copié/collé dans VS c'est relativement clair...

  8. #7
    invitef8fdcbb2

    Re : pthread

    en fait, les 2 thread accédent à des données communes en l'occurence un tableau. Pour accéder à des données globales, il est donc indispensable de mettre en oeuvre un mécanisme d'exclusion mutuelle pour l'accés aux données partagées..je n'sais pas pourquoi mais je pense que pthraed-create ne fonctionne pas correctement pcq à chaque execution il y a qu'un seul thread qui affiche toujours le thread 0 et ça c'est a partir de la 2eme execution..j'arrive pas a trouver le probleme..

  9. #8
    invite473b01b1

    Re : pthread

    Citation Envoyé par sysunic Voir le message
    en fait, les 2 thread accédent à des données communes en l'occurence un tableau.
    Oui autant pour moi je n'avais pas vu qu'il était global!
    Il est préférable d'utiliser un préfixe pour les variables globales afin de mieux les distinguer, on utilise souvent un underscore (ex: int _tab[N] )

  10. #9
    invitef8fdcbb2

    Re : pthread

    ok mercii

  11. #10
    invite1c6b0acc

    Re : pthread

    Pourquoi ne regardes-tu pas dans le fichier core pour savoir quelle instruction a planté ton programme ?
    Il suffit d'utiliser le debugger, (gdb a priori) et il te donnera la pile d'appel des fonctions, la ligne courante et la valeur de toutes les variables au moment du plantage. En général, ça suffit.

  12. #11
    invitef8fdcbb2

    Re : pthread

    ok mais comment faire ça?

  13. #12
    invite1c6b0acc

    Re : pthread

    Citation Envoyé par sysunic Voir le message
    ok mais comment faire ça?
    1. autoriser la production de fichiers core (avec ulimit -c unlimited)
    2. compiler avec l'option -g pour avoir des infos de debug (nom des variables et fonctions, position dans le code source, etc.)
    3. lancer le programme, qui produit alors un fichier core (le nom est variable suivant le paramétrage du systeme)
    4. gdb machin fichier.core (machin = path de l'exécutable ayant produit le fichier core)

    Suivant le système la syntaxe d'appel de gdb n'est peut-être pas la même : voir "man gdb".

  14. #13
    invitef8fdcbb2

    Re : pthread

    ok merci bcp

Discussions similaires

  1. segmentation fault pthread
    Par invite6201c031 dans le forum Programmation et langages, Algorithmique
    Réponses: 8
    Dernier message: 22/06/2011, 10h23
  2. Librairie pthread manquante pour OpenMP sous Windows
    Par invite87912a33 dans le forum Logiciel - Software - Open Source
    Réponses: 0
    Dernier message: 08/07/2010, 21h52