侧边栏壁纸
博主头像
noerror

虚灵不寐,众理具而万事出。

  • 累计撰写 238 篇文章
  • 累计创建 9 个标签
  • 累计收到 2 条评论
标签搜索

目 录CONTENT

文章目录

pthread_setaffinity_np函数用法详解

noerror
2022-10-04 / 0 评论 / 0 点赞 / 48 阅读 / 1,007 字 / 正在检测是否收录...

pthread_setaffinity_np函数用法详解

pthread_setaffinity_np函数简介

  • 头文件包含
#include <pthread.h>
  • 函数定义
int pthread_setaffinity_np(pthread_t  thread , size_t  cpusetsize ,
                           const cpu_set_t * cpuset );
int pthread_getaffinity_np(pthread_t  thread , size_t  cpusetsize ,
                           cpu_set_t * cpuset );
  • 编译链接选项
-pthread

pthread_setaffinity_np函数常见使用错误

  • 链接错误
    undefined reference to `pthread_setaffinity_np'
    解决办法:添加链接选项
-pthread
  • 编译错误
    warning: implicit declaration of function ‘pthread_setaffinity_np’ [-Wimplicit-function-declaration]
    解决办法:包含头文件
#include <pthread.h>

pthread_setaffinity_np函数详细描述

如果调用成功,pthread_setaffinity_np ()函数将线程thread的CPU关联掩码设置为cpuset 指向的CPU集,并且该线程当前不在cpuset 中的某个CPU上运行,那么它将被迁移到这些CPU中的某个CPU上。
pthread_getaffinity_np ()函数返回cpuset 指向的缓冲区中线程thread的CPU关联掩码
有关CPU关联掩码的更多详细信息,请参见sched_setaffinity (2)有关可用于操作和检查CPU集的一组宏的说明,请参见CPU_SET (3)
参数cpusetsize是cpuset 指向的缓冲区的长度(以字节为单位)。通常,此参数将被指定为sizeof(cpu_set_t) (如果使用CPU_SET (3)中描述的宏来动态分配CPU集,则可能是其他值)

pthread_setaffinity_np函数返回值

如果成功,这些函数返回0;错误时,它们返回一个非零错误号。

pthread_setaffinity_np函数错误码

  • 提供的内存地址无效。
  • EINVAL ( pthread_setaffinity_np ())亲和位掩码mask不包含当前物理上在系统上的处理器,并且根据cpuset (7)中描述的“CPUSET”机制可能施加的任何限制允许线程使用这些处理器
  • EINVAL ( pthread_setaffinity_np ()) cpuset指定的CPU在内核支持的集合之外。(内核配置选项CONFIG_NR_CPUS定义用于表示CPU集的内核数据类型所支持的集的范围。)
  • EINVAL ( pthread_getaffinity_np ()) cpusetsize小于内核使用的关联掩码的大小。
  • 找不到ID为thread的线程。

pthread_setaffinity_np函数其他说明

在调用pthread_setaffinity_np ()之后,线程将实际运行的CPU集是cpuset参数中指定的CPU集和系统上实际存在的CPU集的交集。如果正在使用cpuset (7)中描述的“CPUSET”机制,则系统可以进一步限制线程在其上运行的CPU集。这些对线程将在其上运行的实际CPU集的限制是由内核静默施加的。
这些函数是在sched_setaffinity (2)和sched_getaffinity (2)系统调用之上实现的。
仅在glibc2.3.3中,这些函数的版本没有cpusetsize参数。相反,给底层系统调用的CPU集大小总是sizeof(cpu_set_t)
由pthread_create (3)创建的新线程继承其创建者的CPU关联掩码的副本。

pthread_setaffinity_np函数使用举例

在下面的程序中,主线程使用pthread_setaffinity_np ()将其CPU关联掩码设置为包括CPU 0到7(系统上可能并非所有CPU都可用),然后调用pthread_getaffinity_np ()来检查线程的CPU关联掩码。

#define _GNU_SOURCE
#include <pthread.h>
#include <stdio.h>
#include <stdlib.h>
#include <errno.h>

#define handle_error_en(en, msg) \e
       do { errno = en; perror(msg); exit(EXIT_FAILURE); } while (0)

int
main(int argc, char *argv[])
{
   int s;
   cpu_set_t cpuset;
   pthread_t thread;

   thread = pthread_self();

   /* Set affinity mask to include CPUs 0 to 7 */

   CPU_ZERO(&cpuset);
   for (int j = 0; j < 8; j++)
       CPU_SET(j, &cpuset);

   s = pthread_setaffinity_np(thread, sizeof(cpuset), &cpuset);
   if (s != 0)
       handle_error_en(s, "pthread_setaffinity_np");

   /* Check the actual affinity mask assigned to the thread */

   s = pthread_getaffinity_np(thread, sizeof(cpuset), &cpuset);
   if (s != 0)
       handle_error_en(s, "pthread_getaffinity_np");

   printf("Set returned by pthread_getaffinity_np() contained:\en");
   for (int j = 0; j < CPU_SETSIZE; j++)
       if (CPU_ISSET(j, &cpuset))
           printf("    CPU %d\en", j);

   exit(EXIT_SUCCESS);
}
0

评论区