Linux C/C++ 线程亲和性:pthread_attr_getaffinity_np() 和 pthread_attr_setaffinity_np() 函数详解及示例
Linux C/C++ 线程亲和性:pthread_attr_getaffinity_np() 和 pthread_attr_setaffinity_np() 函数详解及示例
在多线程编程中,有时需要控制线程在哪个 CPU 上运行,这可以通过设置线程的 CPU 亲和性来实现。Linux 提供了 pthread_attr_getaffinity_np() 和 pthread_attr_setaffinity_np() 函数来获取和设置线程的 CPU 亲和性。
pthread_attr_getaffinity_np() 函数
pthread_attr_getaffinity_np() 函数用于获取线程的亲和性,即线程可以运行在哪些特定的处理器上。该函数的原型如下:
int pthread_attr_getaffinity_np(const pthread_attr_t *attr, size_t cpusetsize, cpu_set_t *cpuset);
其中,attr 是指向线程属性对象的指针,cpusetsize 是指定亲和性数据结构的大小,cpuset 是指向存储亲和性信息的数据结构的指针。
pthread_attr_setaffinity_np() 函数
pthread_attr_setaffinity_np() 函数用于设置线程的亲和性,即线程可以运行在哪些特定的处理器上。该函数的原型如下:
int pthread_attr_setaffinity_np(pthread_attr_t *attr, size_t cpusetsize, const cpu_set_t *cpuset);
其中,attr 是指向线程属性对象的指针,cpusetsize 是指定亲和性数据结构的大小,cpuset 是指向存储亲和性信息的数据结构的指针。
示例代码
#include <pthread.h>
#include <stdio.h>
void* thread_func(void* arg) {
// 在子线程中获取线程的亲和性
cpu_set_t cpuset;
pthread_t thread = pthread_self();
pthread_attr_t attr;
pthread_attr_init(&attr);
pthread_attr_getaffinity_np(&attr, sizeof(cpu_set_t), &cpuset);
printf("Thread %lu is running on CPU: ", thread);
for (int i = 0; i < CPU_SETSIZE; i++) {
if (CPU_ISSET(i, &cpuset)) {
printf("%d ", i);
}
}
printf("\n");
pthread_attr_destroy(&attr);
return NULL;
}
int main() {
pthread_t thread;
cpu_set_t cpuset;
// 创建线程并设置线程的亲和性
pthread_create(&thread, NULL, thread_func, NULL);
CPU_ZERO(&cpuset);
CPU_SET(0, &cpuset); // 设置线程运行在 CPU 0 上
pthread_setaffinity_np(thread, sizeof(cpu_set_t), &cpuset);
// 主线程获取并打印自身的亲和性
pthread_getaffinity_np(pthread_self(), sizeof(cpu_set_t), &cpuset);
printf("Main thread is running on CPU: ");
for (int i = 0; i < CPU_SETSIZE; i++) {
if (CPU_ISSET(i, &cpuset)) {
printf("%d ", i);
}
}
printf("\n");
pthread_join(thread, NULL);
return 0;
}
在上面的例子中,首先创建了一个子线程,并通过 pthread_setaffinity_np() 函数将子线程设置在 CPU 0 上运行。然后,主线程通过 pthread_getaffinity_np() 函数获取并打印自身的亲和性。最后,在子线程中通过 pthread_attr_getaffinity_np() 函数获取并打印子线程的亲和性。
注意
在使用这两个函数时,需要链接 pthread 库,并在编译时加上 -pthread 参数。
总结
pthread_attr_getaffinity_np() 和 pthread_attr_setaffinity_np() 函数是 Linux C/C++ 中用于控制线程在哪个 CPU 上运行的强大工具,可以帮助开发者提高多线程程序的性能。
原文地址: https://www.cveoy.top/t/topic/qENt 著作权归作者所有。请勿转载和采集!