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);
}
评论区