CPU亲和力口罩(把线程放在不同的CPU上)

我有4个线程,我想设置线程1在CPU 1上运行,CPU 2上的线程2等。但是,当我运行我的代码下面,亲和力掩码返回正确的值,但是当我做sched_getcpu()在线程上,它们都返回它们在CPU 4上运行。

有人知道我的问题在这里?

提前致谢!

#define _GNU_SOURCE #include <stdio.h> #include <pthread.h> #include <stdlib.h> #include <sched.h> #include <errno.h> void *pthread_Message(char *message) { printf("%s is running on CPU %d\n", message, sched_getcpu()); } int main() { pthread_t thread1, thread2, thread3, thread4; pthread_t threadArray[4]; cpu_set_t cpu1, cpu2, cpu3, cpu4; char *thread1Msg = "Thread 1"; char *thread2Msg = "Thread 2"; char *thread3Msg = "Thread 3"; char *thread4Msg = "Thread 4"; int thread1Create, thread2Create, thread3Create, thread4Create, i, temp; CPU_ZERO(&cpu1); CPU_SET(1, &cpu1); temp = pthread_setaffinity_np(thread1, sizeof(cpu_set_t), &cpu1); printf("Set returned by pthread_getaffinity_np() contained:\n"); for (i = 0; i < CPU_SETSIZE; i++) if (CPU_ISSET(i, &cpu1)) printf("CPU1: CPU %d\n", i); CPU_ZERO(&cpu2); CPU_SET(2, &cpu2); temp = pthread_setaffinity_np(thread2, sizeof(cpu_set_t), &cpu2); for (i = 0; i < CPU_SETSIZE; i++) if (CPU_ISSET(i, &cpu2)) printf("CPU2: CPU %d\n", i); CPU_ZERO(&cpu3); CPU_SET(3, &cpu3); temp = pthread_setaffinity_np(thread3, sizeof(cpu_set_t), &cpu3); for (i = 0; i < CPU_SETSIZE; i++) if (CPU_ISSET(i, &cpu3)) printf("CPU3: CPU %d\n", i); CPU_ZERO(&cpu4); CPU_SET(4, &cpu4); temp = pthread_setaffinity_np(thread4, sizeof(cpu_set_t), &cpu4); for (i = 0; i < CPU_SETSIZE; i++) if (CPU_ISSET(i, &cpu4)) printf("CPU4: CPU %d\n", i); thread1Create = pthread_create(&thread1, NULL, (void *)pthread_Message, thread1Msg); thread2Create = pthread_create(&thread2, NULL, (void *)pthread_Message, thread2Msg); thread3Create = pthread_create(&thread3, NULL, (void *)pthread_Message, thread3Msg); thread4Create = pthread_create(&thread4, NULL, (void *)pthread_Message, thread4Msg); pthread_join(thread1, NULL); pthread_join(thread2, NULL); pthread_join(thread3, NULL); pthread_join(thread4, NULL); return 0; } 

您正试图设置您没有初始化的线程的亲和力。

编辑:好吧,让我给你一些更多的信息:

不要混合线程句柄(你在pthread_t变量中存储的东西)和它们代表的东西(一个运行在某个地方的执行线程)。 你要做的是在开始之前设置一个线程的属性,用一个需要线程对象的API。 正如pthread_create创建对象并同时启动执行一样,所以尝试使用pthread_setaffinity_np并不是正确的方法(如果要更改当前正在运行的线程的相似性,这很有用)。

但是… pthread_create有一个属性参数(你将NULL传递给它)。 这是存储如何创建线程的信息。

亲和力是您可以通过该参数设置的属性之一。 有关pthread_attr_initpthread_attr_setaffinity_np ,请参阅man-page文档

这是你在找什么。 我知道这是一个迟到的答案,但这可能会帮助其他人。

 #include <stdio.h> #include <pthread.h> #include <stdlib.h> #include <sched.h> #include <errno.h> #include <unistd.h> int getNumberOfCpus( void ) { long nprocs = -1; long nprocs_max = -1; # ifdef _SC_NPROCESSORS_ONLN nprocs = sysconf( _SC_NPROCESSORS_ONLN ); if ( nprocs < 1 ) { //std::cout << "Could not determine number of CPUs on line. Error is " << strerror( errno ) << std::endl; return 0; } nprocs_max = sysconf( _SC_NPROCESSORS_CONF ); if ( nprocs_max < 1 ) { //std::cout << "Could not determine number of CPUs in host. Error is " << strerror( errno ) << std::endl; return 0; } //std::cout << nprocs < " of " << nprocs_max << " online" << std::endl; return nprocs; #else //std::cout << "Could not determine number of CPUs" << std::endl; return 0; #endif } void *pthread_Message( void *ptr ) { sleep(10); char *message; message = (char *) ptr; printf("%s \n", message); cpu_set_t l_cpuSet; int l_maxCpus; int j; unsigned long l_cpuBitMask; CPU_ZERO( &l_cpuSet ); printf("get affinity %d\n",pthread_getaffinity_np(pthread_self() , sizeof( cpu_set_t ), &l_cpuSet )); // printf("cpuset %d\n",l_cpuSet); printf (" thread id %u\n", pthread_self()); if ( pthread_getaffinity_np(pthread_self() , sizeof( cpu_set_t ), &l_cpuSet ) == 0 ) for (int i = 0; i < 4; i++) if (CPU_ISSET(i, &l_cpuSet)) printf("XXXCPU: CPU %d\n", i); for (long i=0; i< 10000000000; ++i); } int main() { pthread_t thread1, thread2, thread3, thread4; pthread_t threadArray[4]; cpu_set_t cpu1, cpu2, cpu3, cpu4; const char *thread1Msg = "Thread 1"; const char *thread2Msg = "Thread 2"; const char *thread3Msg = "Thread 3"; const char *thread4Msg = "Thread 4"; int thread1Create, thread2Create, thread3Create, thread4Create, i, temp; thread1Create = pthread_create(&thread1, NULL, &pthread_Message, (void*)thread1Msg); sleep(1); thread2Create = pthread_create(&thread2, NULL, &pthread_Message, (void*)thread2Msg); sleep(1); thread3Create = pthread_create(&thread3, NULL, &pthread_Message, (void*)thread3Msg); sleep(1); thread4Create = pthread_create(&thread4, NULL, &pthread_Message, (void*)thread4Msg); CPU_ZERO(&cpu1); CPU_SET(0, &cpu1); temp = pthread_setaffinity_np(thread1, sizeof(cpu_set_t), &cpu1); printf("setaffinity=%d\n", temp); printf("Set returned by pthread_getaffinity_np() contained:\n"); for (i = 0; i < CPU_SETSIZE; i++) if (CPU_ISSET(i, &cpu1)) printf("CPU1: CPU %d\n", i); CPU_ZERO(&cpu2); CPU_SET(1, &cpu2); temp = pthread_setaffinity_np(thread2, sizeof(cpu_set_t), &cpu2); for (i = 0; i < CPU_SETSIZE; i++) if (CPU_ISSET(i, &cpu2)) printf("CPU2: CPU %d\n", i); CPU_ZERO(&cpu3); CPU_SET(2, &cpu3); temp = pthread_setaffinity_np(thread3, sizeof(cpu_set_t), &cpu3); for (i = 0; i < CPU_SETSIZE; i++) if (CPU_ISSET(i, &cpu3)) printf("CPU3: CPU %d\n", i); CPU_ZERO(&cpu4); CPU_SET(3, &cpu4); temp = pthread_setaffinity_np(thread4, sizeof(cpu_set_t), &cpu4); for (i = 0; i < CPU_SETSIZE; i++) if (CPU_ISSET(i, &cpu4)) printf("CPU4: CPU %d\n", i); // pthread_setaffinity_np(pthread_self(), sizeof(cpu_set_t), &cpu1); // pthread_setaffinity_np(pthread_self(), sizeof(cpu_set_t), &cpu1); pthread_join(thread1, NULL); pthread_join(thread2, NULL); pthread_join(thread3, NULL); pthread_join(thread4, NULL); return 0; } 

我认为最简单的方法是将CPU掩码作为参数提供给每个线程,并且给出线程请求给出的关联本身,如下例所示: pthread_setaffinity_np(3)