现在的位置: 首页 > 综合 > 正文

Manual: pthread_setaffinity_np, pthread_getaffinity_np

2018年05月13日 ⁄ 综合 ⁄ 共 4048字 ⁄ 字号 评论关闭

zz

http://linux.frank4dd.com/en/man3/pthread_setaffinity_np.htm

http://www.daemon-systems.org/man/pthread_getaffinity_np.3.html

NAME


pthread_setaffinity_np, pthread_getaffinity_np - set/getCPU affinity of a thread

SYNOPSIS



#define _GNU_SOURCE
#include <pthread.h>

int pthread_setaffinity_np(pthread_t thread, size_tcpusetsize,
const cpu_set_t *
cpuset);
int pthread_getaffinity_np(pthread_t
thread, size_t
cpusetsize,
cpu_set_t *
cpuset);

Compile and link with -pthread.

DESCRIPTION


Thepthread_setaffinity_np() functionsets the CPU affinity mask of the threadthread to the CPU set pointed to bycpuset. If the call is successful,and the thread is not currently running on one of the CPUs incpuset,
then it is migrated to one of those CPUs.

Thepthread_getaffinity_np() function returns the CPU affinity mask of the threadthread in the buffer pointed to bycpuset.

For more details on CPU affinity masks, seesched_setaffinity(2).For a description of a set of macrosthat can be used to manipulate and inspect CPU sets, seeCPU_SET(3).

The argumentcpusetsize is the length (in bytes) of the buffer pointed to bycpuset. Typically, this argument would be specified assizeof(cpu_set_t). (It may be some other value, if using the macros described inCPU_SET(3)for
dynamically allocating a CPU set.)

RETURN VALUE


On success, these functions return 0;on error, they return a non-zero error number.

ERRORS


EFAULT A supplied memory address was invalid.
EINVAL (pthread_setaffinity_np()) The affinity bit maskmask contains no processors that are currently physically on the systemand permitted to the thread according to any restrictions thatmay be imposed by the "cpuset"
mechanism described incpuset(7).
EINVAL (pthread_setaffinity_np()) cpuset specified a CPU that was outside the set supported by the kernel.(The kernel configuration optionCONFIG_NR_CPUS defines the range of the set supported by the kernel
data typeused to represent CPU sets.)
EINVAL (pthread_getaffinity_np()) cpusetsize is smaller than the size of the affinity mask used by the kernel.
ESRCH No thread with the IDthread could be found.

VERSIONS


These functions are provided by glibc since version 2.3.4.

CONFORMING TO


These functions are non-standard GNU extensions;hence the suffix "_np" (non-portable) in the names.

NOTES


After a call topthread_setaffinity_np(), the set of CPUs on which the thread will actually run isthe intersection of the set specified in thecpuset argument and the set of CPUs actually present on the system.The system may further
restrict the set of CPUs on which the threadruns if the "cpuset" mechanism described incpuset(7)is being used.These restrictions on the actual set of CPUs on which the threadwill run are silently imposed
by the kernel.

These functions are implemented on top of thesched_setaffinity(2)andsched_getaffinity(2)system calls.

In glibc 2.3.3 only,versions of these functions were provided that did not have acpusetsize argument.Instead the CPU set size given to the underlying system calls was alwayssizeof(cpu_set_t).

A new thread created bypthread_create() inherits a copy of its creator’s CPU affinity mask.

EXAMPLE


In the following program, the main thread usespthread_setaffinity_np() to set its CPU affinity mask to include CPUs 0 to 7(which may not all be available on the system),and then callspthread_getaffinity_np() to check the
resulting CPU affinity mask of the thread.

#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);
}

SEE ALSO


sched_getcpu(3),sched_setaffinity(2),sched_setscheduler(2),pthread_attr_setaffinity_np(3),pthread_self(3),cpuset(7),pthreads(7)

COLOPHON


This page is part of release 3.23 of the Linuxman-pages project.A description of the project,and information about reporting bugs,can be found athttp://www.kernel.org/doc/man-pages/.

抱歉!评论已关闭.