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 上运行的强大工具,可以帮助开发者提高多线程程序的性能。

Linux C/C++ 线程亲和性:pthread_attr_getaffinity_np() 和 pthread_attr_setaffinity_np() 函数详解及示例

原文地址: https://www.cveoy.top/t/topic/qENt 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录