pthread
Hors ligneSysunix Le 10/03/2016 à 22:05 Profil de Sysunix Configuration de Sysunix

http://forums.cnetfrance.fr/search.php?searchid=51...

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:

#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
      }


Vous avez résolu votre problème avec VIC ? Faites-le savoir sur les réseaux sociaux !
Vulgarisation-informatique.com
Cours en informatique & tutoriels