pthead 亲和性设置 绑定 CPU 详解 pthread_attr_setaffinity_np pthread_setaffinity_np

pthead 亲和性设置

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 
    #include 
    #include 
    #include 
    
    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 
    #include 
    #include 
    #include 
    
    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 亲和性的设置。

你可能感兴趣的:(并发编程,linux,c语言)