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
      }