Loading

NOM

       pthread_setaffinity_np,  pthread_getaffinity_np  -  Définir  et obtenir
       l’affinité CPU d’un thread

SYNOPSIS

       #define _GNU_SOURCE
       #include <pthread.h>

       int pthread_setaffinity_np(pthread_t thread, size_t cpusetsize,
                                  const cpu_set_t *cpuset);
       int pthread_getaffinity_np(pthread_t thread, size_t cpusetsize,
                                  cpu_set_t *cpuset);

       Compilez et effectuez l’édition des liens avec l’option -pthread.

       La fonction pthread_setaffinity_np() définit le masque  d’affinité  CPU
       du  thread  thread  comme étant l’ensemble de CPU pointé par cpuset. Si
       l’appel réussit et que le thread n’est pas en cours d’exécution sur  un
       des CPU de cpuset, alors il est déplacé sur un de ces CPU.

       La fonction pthread_getaffinity_np() renvoie, dans le tampon pointé par
       cpuset, le masque d’affinité CPU du thread thread.

       Pour  plus  de  détails  sur  les  masques  d’affinité  CPU,  consultez
       sched_setaffinity(2).  Pour  une  description  d’un  jeu  de macros qui
       peuvent être utilisées pour manipuler et  inspecter  des  ensembles  de
       CPU, consultez CPU_SET(3).

       Le  paramètre  cpusetsize  est la longueur (en octets) du tampon pointé
       par cpuset. Typiquement, ce paramètre sera sizeof (cpu_set_t) (il  peut
       prendre  d’autres  valeurs,  si  on  utilise  les  macros décrites dans
       CPU_SET(3) pour allouer dynamiquement un ensemble de CPU).

VALEUR RENVOYÉE

       En cas de réussite, ces fonctions renvoient 0 ; en cas  d’erreur  elles
       renvoient un numéro d’erreur non nul.

ERREURS

       EFAULT Une adresse mémoire fournie n’était pas valable.

       EINVAL (pthread_setaffinity_np())  Le masque de bits d’affinité mask ne
              contient pas de processeurs qui soit  actuellement  physiquement
              sur   le   système  et  autorisé  pour  le  thread  d’après  les
              restrictions imposées par le mécanisme d’ensembles de CPU décrit
              dans cpuset(7).

       EINVAL (pthread_setaffinity_np()) Le cpuset indique un CPU en dehors de
              l’ensemble  pris  en  charge   par   le   noyau   (l’option   de
              configuration  du  noyau  CONFIG_NR_CPUS définie l’intervalle de
              l’ensemble pris en charge  par  le  type  de  données  du  noyau
              utilisé pour représenter les ensembles de CPU).

       EINVAL (pthread_getaffinity_np())  cpusetsize  est  plus  petit  que le
              taille du masque d’affinité utilisé par le noyau.

       ESRCH  Aucun thread avec pour identifiant thread n’a pu être trouvé.

VERSIONS

       Ces fonctions sont fournies par la glibc depuis la version 2.3.4.

CONFORMITÉ

       Ces fonctions sont des extensions non standard GNU ; c’est la raison du
       suffixe « _np » (non portable) dans leur nom.

NOTES

       Après  un  appel  à  pthread_setaffinity_np(),  l’ensemble  de  CPU sur
       lesquels le processus  s’exécutera  est  l’intersection  de  l’ensemble
       spécifié  dans  le  paramètre cpuset et l’ensemble des CPU actuellement
       présents sur le  système.  Le  système  peut  restreindre  encore  plus
       l’ensemble  des  CPU  sur  lesquels  le  processus  peut  tourner si le
       mécanisme  « cpuset »,  décrit  dans  cpuset(7),   est   utilisé.   Ces
       restrictions sur le véritable ensemble de CPU sur lesquels le processus
       peut tourner sont imposées sans avertissement par le noyau.

       Ces  fonctions  sont  implémentées  en  utilisant  les  appels  système
       sched_setaffinity(2) et sched_getaffinity(2).

       Dans  la  glibc  2.3.3,  uniquement,  les  versions  de  ces  fonctions
       n’avaient pas de  paramètre  cpusetsize.  À  la  place,  la  taille  de
       l’ensemble  de  CPU fourni à l’appel système sous-jacent était toujours
       sizeof(cpu_set_t).

       Un nouveau thread créé avec  pthread_create()  hérite  d’une  copie  du
       masque d’affinité CPU de son créateur.

EXEMPLE

       Dans    le    programme    suivant,   le   thread   principal   utilise
       pthread_setaffinity_np()  pour  définir  son  masque   d’affinité   CPU
       incluant  les  CPU  0 à 7 (qui peuvent ne pas être tous présents sur le
       système), puis appelle pthread_getaffinity_np() pour vérifier le masque
       d’affinité CPU finalement utilisé pour le thread.

       #define _GNU_SOURCE
       #include <pthread.h>
       #include <stdio.h>
       #include <stdlib.h>
       #include <errno.h>

       #define handle_error_en(en, msg) \
               do { errno = en; perror(msg); exit(EXIT_FAILURE); } while (0)

       int
       main(int argc, char *argv[])
       {
           int s, j;
           cpu_set_t cpuset;
           pthread_t thread;

           thread = pthread_self();

           /* Set affinity mask to include CPUs 0 to 7 */

           CPU_ZERO(&cpuset);
           for (j = 0; j < 8; j++)
               CPU_SET(j, &cpuset);

           s = pthread_setaffinity_np(thread, sizeof(cpu_set_t), &cpuset);
           if (s != 0)
               handle_error_en(s, "pthread_setaffinity_np");

           /* Check the actual affinity mask assigned to the thread */

           s = pthread_getaffinity_np(thread, sizeof(cpu_set_t), &cpuset);
           if (s != 0)
               handle_error_en(s, "pthread_getaffinity_np");

           printf("Set returned by pthread_getaffinity_np() contained:\n");
           for (j = 0; j < CPU_SETSIZE; j++)
               if (CPU_ISSET(j, &cpuset))
                   printf("    CPU %d\n", j);

           exit(EXIT_SUCCESS);
       }

VOIR AUSSI

       sched_getcpu(3),      sched_setaffinity(2),      sched_setscheduler(2),
       pthread_attr_setaffinity_np(3), pthread_self(3), cpuset(7), pthreads(7)

COLOPHON

       Cette  page  fait  partie  de  la  publication 3.23 du projet man-pages
       Linux. Une description du projet et des instructions pour signaler  des
       anomalies       peuvent       être       trouvées      à      l’adresse
       http://www.kernel.org/doc/man-pages/.

TRADUCTION

       Cette page de manuel a  été  traduite  et  est  maintenue  par  Nicolas
       François  <nicolas.francois@centraliens.net> et l’équipe francophone de
       traduction de Debian.

       Veuillez  signaler  toute  erreur   de   traduction   en   écrivant   à
       <debian-l10n-french@lists.debian.org> ou par un rapport de bogue sur le
       paquet manpages-fr.

       Vous pouvez toujours avoir accès à la version anglaise de  ce  document
       en utilisant la commande « man -L C <section> <page_de_man> ».