• pthead 亲和性设置详解 pthread_attr_setaffinity_np pthread_setaffinity_np


    pthread 亲和性设置

    pthread_attr_setaffinity_np

    • 函数原型:

      int pthread_attr_setaffinity_np(pthread_attr_t *attr, size_t cpusetsize,
          const cpu_set_t *cpuset);
      
      • 1
      • 2
      • 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);
      
      • 1
      • 2
      • 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;
      }
      
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6
      • 7
      • 8
      • 9
      • 10
      • 11
      • 12
      • 13
      • 14
      • 15
      • 16
      • 17
      • 18
      • 19
      • 20
      • 21
      • 22
      • 23
      • 24
      • 25
      • 26
      • 27
      • 28
      • 29
      • 30
      • 31
      • 32
      • 33
      • 34
      • 35
      • 36
      • 37
      • 38
      • 39

    示例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
      • 2
      • 3
      • 4
      • 5
      • 6
      • 7
      • 8
      • 9
      • 10
      • 11
      • 12
      • 13
      • 14
      • 15
      • 16
      • 17
      • 18
      • 19
      • 20
      • 21
      • 22
      • 23
      • 24
      • 25
      • 26
      • 27
      • 28
      • 29
      • 30
      • 31
      • 32
      • 33
      • 34
      • 35
      • 36
      • 37

    推荐

    • 推荐使用 示例1 中的方式进行 cpu 亲和性的设置。
  • 相关阅读:
    前端开发和后端开发的看法
    数组方法 + ES6中数组方法 + 数组的空位
    类型体操:探究 TypeScript 内置高级类型
    Cobalt Strike
    C语言从文本到执行程序的过程(预编译,编译,汇编)
    阿里P8架构师仅用五步教你如何搭建SpringSecurity安全框架
    RabbitMQ 延时消息实现方式
    HashMap和HashTable的区别
    MySQL笔记总结
    解决新创建的anaconda环境在C:\Users\xxx\.conda\envs\,而不在anaconda安装目录下的envs中
  • 原文地址:https://blog.csdn.net/luohaha66/article/details/134079137