PTHREAD_SETAFFINITY_NP - Linux手册页

时间:2019-08-20 18:01:03  来源:igfitidea点击:

Linux程序员手册 第3部分
更新日期: 2020-06-09

名称

pthread_setaffinity_np,pthread_getaffinity_np-设置/获取线程的CPU亲和力

语法

#define _GNU_SOURCE             /* See feature_test_macros(7) */
#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);

Compile and link with -pthread.

说明

pthread_setaffinity_np()函数将线程的CPU亲和力掩码设置为cpuset指向的CPU集。如果调用成功,并且线程当前不在cpuset中的一个CPU上运行,则将其迁移到这些CPU之一。

pthread_getaffinity_np()函数返回cpuset指向的缓冲区中线程线程的CPU亲和力掩码。

有关CPU亲和力掩码的更多详细信息,请参见sched_setaffinity(2)。有关可用于操作和检查CPU集的一组宏的说明,请参见CPU_SET(3)。

参数cpusetsize是cpuset指向的缓冲区的长度(以字节为单位)。通常,此参数将指定为sizeof(cpu_set_t)。 (如果使用CPU_SET(3)中描述的宏来动态分配CPU集,则可能是其他值。)

返回值

成功时,这些函数返回0;否则,返回0。错误时,它们返回非零错误号。

错误说明

EFAULT
提供的内存地址无效。
EINVAL
(pthread_setaffinity_np())根据cpuset(7)中描述的" cpuset"机制可能施加的任何限制,相似性位掩码掩码不包含当前在系统上物理上并允许线程使用的处理器。
EINVAL
(pthread_setaffinity_np())cpuset指定的CPU超出了内核支持的范围。 (内核配置选项CONFIG_NR_CPUS定义了用于表示CPU集的内核数据类型支持的集的范围。)
EINVAL
(pthread_getaffinity_np())cpusetsize小于内核使用的相似性掩码的大小。
ESRCH
找不到具有ID线程的线程。

版本

从2.3.4版开始,这些功能由glibc提供。

属性

有关本节中使用的术语的说明,请参见attribute(7)。

InterfaceAttributeValue
pthread_setaffinity_np(),pthread_getaffinity_np()Thread safetyMT-Safe

遵循规范

这些功能是非标准的GNU扩展。因此名称中的后缀" _np"(不可移植)。

备注

调用pthread_setaffinity_np()之后,线程将在其上实际运行的CPU组是cpuset参数中指定的组与系统上实际存在的CPU组的交集。如果正在使用cpuset(7)中描述的" cpuset"机制,则系统可能进一步限制线程在其上运行的CPU的集合。这些对线程将在其上实际运行的CPU的实际限制是由内核默默施加的。

这些功能是在sched_setaffinity(2)和sched_getaffinity(2)系统调用之上实现的。

仅在glibc 2.3.3中,提供了这些函数的没有cpusetsize参数的版本。相反,分配给基础系统调用的CPU集大小始终为sizeof(cpu_set_t)。

pthread_create(3)创建的新线程继承了其创建者的CPU关联掩码的副本。

示例

在下面的程序中,主线程使用pthread_setaffinity_np()设置其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) \
        do { errno = en; perror(msg); exit(EXIT_FAILURE); } while (0)

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

    thread = pthread_self();

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

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

    s = pthread_setaffinity_np(thread, sizeof(cpu_set_t), &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(cpu_set_t), &cpuset);
    if (s != 0)
        handle_error_en(s, "pthread_getaffinity_np");

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

    exit(EXIT_SUCCESS);
}

出版信息

这个页面是Linux手册页项目5.08版的一部分。有关项目的说明、有关报告错误的信息以及此页面的最新版本,请访问https://www.kernel.org/doc/man-pages/