Notez que j'ai dû définir l'affinité du processeur pour que le thread fasse une certaine expérience.
Le thread de processus s'exécute sur l'un des cœurs du processeur en fonction du système d'exploitation. En définissant l'affinité du processeur, il est possible de limiter et de spécifier arbitrairement le cœur du processeur à exécuter.
Linux a une fonction sched_setaffinity pour définir l'affinité CPU.
#define _GNU_SOURCE
#include <sched.h>
int main() {
pid_t pid;
cpu_set_t cpu_set;
int result;
pid = getpid;
CPU_ZERO(&cpu_set);
CPU_SET(2, &cpu_set);
result = sched_setaffinity(pid, sizeof(cpu_set_t), &cpu_set);
if (result != 0) {
//Erreur
}
//En traitement
return 0;
}
La structure cpu_set_t représente un ensemble de processeurs. Initialisez la structure cpu_set_t avec la fonction CPU_ZERO, puis spécifiez le cœur de CPU à exécuter avec la fonction CPU_SET. Pour un processeur à 4 cœurs, spécifiez une valeur comprise entre 0 et 3 comme premier argument. Pour plus de détails, reportez-vous au Manual.
sched_setaffinity L'argument de la fonction est l'ID de processus, la taille des données de cpu_set_t et le pointeur de cpu_set_t dans l'ordre.
Le premier argument peut être la fonction getpid. Le deuxième argument est fondamentalement sizeof (cpu_set_t). Le troisième argument spécifie le pointeur de la variable de structure cpu_set_t spécifiée par CPU_SET.
Avec la méthode ci-dessus, il est défini dans le processus lui-même, donc si vous souhaitez définir une affinité pour chaque thread, c'est un peu différent.
Selon l'environnement, c'est possible avec pthread_setaffinity_np. L'exemple de programme est omis car il est décrit dans Manual.
Si la fonction ci-dessus ne peut pas être utilisée, elle peut être définie en passant l'ID de thread au premier argument de la fonction sched_setaffinity. Si vous pouvez utiliser la fonction gettid, vous pouvez simplement lancer la variable de structure pid_t obtenue par la fonction gettid.
Si la fonction gettid ne peut pas être utilisée, appelez directement l'appel système pour obtenir l'ID de thread.
#include <sched.h>
#include <pthread.h>
#include <unistd.h>
#include <sys/syscall.h>
#include <sys/types.h>
pid_t gettid(void) {
return syscall(SYS_gettid);
}
void* thread_main(void* args) {
pid_t pid;
cpu_set_t cpu_set;
int result;
pid = gettid;
CPU_ZERO(&cpu_set);
CPU_SET(2, &cpu_set);
result = sched_setaffinity(pid, sizeof(cpu_set_t), &cpu_set);
if (result != 0) {
//Erreur
}
//En traitement
return NULL;
}
int main() {
pthread_t p;
pthread_create(&p, NULL, thread_main, NULL);
//En traitement
return 0;
}
Veuillez signaler toute erreur.
Recommended Posts