pthread 亲和性设置
pthread_attr_setaffinity_np
-
函数原型:
int pthread_attr_setaffinity_np(pthread_attr_t *attr, size_t cpusetsize, const cpu_set_t *cpuset);
- attr:指向线程属性对象的指针。
- cpusetsize:CPU 亲和性集合的大小(以字节为单位)。
- cpuset:指向 CPU 亲和性集合的指针,其中包含要绑定线程的 CPU。
- 返回值:成功返回 0,失败返回错误代码。
-
用于设置线程的 CPU 亲和性(CPU Affinity)。
-
它允许将线程绑定到特定的 CPU 核心或 CPU 集合上,以控制线程在哪些 CPU 上运行。
pthread_setaffinity_np
-
函数原型:
int pthread_setaffinity_np(pthread_t thread, size_t cpusetsize, const cpu_set_t *cpuset);
- thread:要设置 CPU 亲和性的线程标识符。
- cpusetsize:CPU 亲和性集合的大小(以字节为单位)。
- cpuset:指向 CPU 亲和性集合的指针,其中包含要绑定线程的 CPU。
- 返回值:成功返回 0,失败返回错误代码。
-
用于设置线程的 CPU 亲和性(CPU Affinity)。
-
它允许将线程绑定到特定的 CPU 核心或 CPU 集合上,以控制线程在哪些 CPU 上运行。
示例1
-
本示例演示了如何在创建线程时限制其只能在 cpu1 上运行。
#define _GNU_SOURCE #include <stdio.h> #include <pthread.h> #include <unistd.h> #include <sched.h> void *thread_func(void *arg) { usleep(10000); // 获取当前线程的 CPU 亲和性 cpu_set_t cpuset; CPU_ZERO(&cpuset); pthread_getaffinity_np(pthread_self(), sizeof(cpu_set_t), &cpuset); // 打印当前线程绑定的 CPU for (int i = 0; i < CPU_SETSIZE; i++) { if (CPU_ISSET(i, &cpuset)) { printf("thread is running on cpu %d\n", i); } } return NULL; } int main() { pthread_t tid; pthread_attr_t attr; pthread_attr_init(&attr); // 创建线程并设置其只能在 cpu1 上运行 cpu_set_t mask; CPU_ZERO(&mask); CPU_SET(1, &mask); pthread_attr_setaffinity_np(&attr, sizeof(mask), &mask); pthread_create(&tid, &attr, thread_func, NULL); pthread_attr_destroy(&attr); pthread_join(tid, NULL); return 0; }
示例2
-
本示例演示了如何在创建线程后限制其只能在 cpu0 1 2 上运行。
#define _GNU_SOURCE #include <stdio.h> #include <pthread.h> #include <unistd.h> #include <sched.h> void *thread_func(void *arg) { usleep(10000); // 获取当前线程的 CPU 亲和性 cpu_set_t cpuset; CPU_ZERO(&cpuset); pthread_getaffinity_np(pthread_self(), sizeof(cpu_set_t), &cpuset); // 打印当前线程绑定的 CPU for (int i = 0; i < CPU_SETSIZE; i++) { if (CPU_ISSET(i, &cpuset)) { printf("thread is running on cpu %d\n", i); } } return NULL; } int main() { // 创建线程并设置其只能在 cpu0 1 2 上运行 pthread_t tid; cpu_set_t mask; CPU_ZERO(&mask); CPU_SET(0, &mask); CPU_SET(1, &mask); CPU_SET(2, &mask); pthread_create(&tid, NULL, thread_func, NULL); pthread_setaffinity_np(tid, sizeof(mask), &mask); pthread_join(tid, NULL); return 0; }
推荐
- 推荐使用
示例1
中的方式进行 cpu 亲和性的设置。