pthread_setaffinity_np(3) | Library Functions Manual | pthread_setaffinity_np(3) |
pthread_setaffinity_np, pthread_getaffinity_np - Définir et obtenir l'affinité CPU d'un thread
Bibliothèque de threads POSIX (libpthread, -lpthread)
#define _GNU_SOURCE /* Consultez feature_test_macros(7) */ #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);
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).
En cas de succès, ces fonctions renvoient 0 ; en cas d'erreur, elles renvoient un code d'erreur non nul.
Ces fonctions sont fournies depuis la glibc 2.3.4.
Pour une explication des termes utilisés dans cette section, consulter attributes(7).
Interface | Attribut | Valeur |
pthread_setaffinity_np(), pthread_getaffinity_np() | Sécurité des threads | MT-Safe |
Ces fonctions sont des extensions GNU non standard ; d'où le suffixe « _np » (non portable) dans leur nom.
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(3) hérite d'une copie du masque d'affinité CPU de son créateur.
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 <err.h> #include <errno.h> #include <pthread.h> #include <stdio.h> #include <stdlib.h> int main(void) {
int s;
cpu_set_t cpuset;
pthread_t thread;
thread = pthread_self();
/* Set affinity mask to include CPUs 0 to 7. */
CPU_ZERO(&cpuset);
for (size_t j = 0; j < 8; j++)
CPU_SET(j, &cpuset);
s = pthread_setaffinity_np(thread, sizeof(cpuset), &cpuset);
if (s != 0)
errc(EXIT_FAILURE, s, "pthread_setaffinity_np");
/* Check the actual affinity mask assigned to the thread. */
s = pthread_getaffinity_np(thread, sizeof(cpuset), &cpuset);
if (s != 0)
errc(EXIT_FAILURE, s, "pthread_getaffinity_np");
printf("Set returned by pthread_getaffinity_np() contained:\n");
for (size_t j = 0; j < CPU_SETSIZE; j++)
if (CPU_ISSET(j, &cpuset))
printf(" CPU %zu\n", j);
exit(EXIT_SUCCESS); }
sched_setaffinity(2), CPU_SET(3), pthread_attr_setaffinity_np(3), pthread_self(3), sched_getcpu(3), cpuset(7), pthreads(7), sched(7)
La traduction française de cette page de manuel a été créée par Christophe Blaess <https://www.blaess.fr/christophe/>, Stéphan Rafin <stephan.rafin@laposte.net>, Thierry Vignaud <tvignaud@mandriva.com>, François Micaux, Alain Portal <aportal@univ-montp2.fr>, Jean-Philippe Guérard <fevrier@tigreraye.org>, Jean-Luc Coulon (f5ibh) <jean-luc.coulon@wanadoo.fr>, Julien Cristau <jcristau@debian.org>, Thomas Huriaux <thomas.huriaux@gmail.com>, Nicolas François <nicolas.francois@centraliens.net>, Florentin Duneau <fduneau@gmail.com>, Simon Paillard <simon.paillard@resel.enst-bretagne.fr>, Denis Barbier <barbier@debian.org>, David Prévot <david@tilapin.org> et Frédéric Hantrais <fhantrais@gmail.com>
Cette traduction est une documentation libre ; veuillez vous reporter à la GNU General Public License version 3 concernant les conditions de copie et de distribution. Il n'y a aucune RESPONSABILITÉ LÉGALE.
Si vous découvrez un bogue dans la traduction de cette page de manuel, veuillez envoyer un message à debian-l10n-french@lists.debian.org.
15 décembre 2022 | Pages du manuel de Linux 6.03 |