PTHREAD_SETAFFINITY_NP

Section: Linux Programmer's Manual (3)
Updated: 2020-11-01
Index JM Home Page
 

名前

pthread_setaffinity_np, pthread_getaffinity_np - スレッドの CPU affinity の設定/取得を行う  

書式

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

-pthread でコンパイルしてリンクする。
 

説明

pthread_setaffinity_np() 関数は、スレッド thread の CPU affinity マスクに cpuset が指す CPU 集合を設定する。呼び出しが成功し、 そのスレッドが現在 cpuset で指定された CPU 上でが実行されていない 場合は、スレッドは指定された CPU のいずれかに移動される。

pthread_getaffinity_np() 関数は、スレッド thread の CPU affinity マスクを、cpuset が指すバッファーに入れて返す。

CPU affinity マスクの詳細については、 sched_setaffinity(2) を参照してほしい。 CPU 集合の操作や取得を行う際に利用できるマクロ群の説明は CPU_SET(3) を参照してほしい。

引数 cpusetsize は cpuset が指すバッファーの長さ (バイト単位) で ある。通常は、この引数には sizeof(cpu_set_t) を指定する (CPU_SET(3) に書かれているマクロを使って CPU 集合を動的に 割り当てている場合には、別の値になることもある)。  

返り値

成功すると、これらの関数は 0 を返す。 エラーの場合、0 以外のエラー番号を返す。  

エラー

EFAULT
指定されたメモリーアドレスが無効である。
EINVAL
(pthread_setaffinity_np()) affinity ビットマスク mask に、 その時点でシステム上に物理的に存在して、かつそのスレッドに対して許可 されているプロセッサが一つも含まれていない。 スレッドに対してどのプロセッサの利用が許可されるかは、cpuset(7) で 説明されている "cpuset" 機構に適用される制限に基づいて決まる。
EINVAL
(pthread_setaffinity_np()) cpuset が、カーネルがサポートする CPU 集合に含まれない CPU を指定していた。(カーネルの設定オプション CONFIG_NR_CPUS により、CPU 集合を表現するのに使われるカーネルの データ型がサポートする CPU 集合の範囲が定義される。)
EINVAL
(pthread_getaffinity_np()) cpusetsize がカーネルが使用する affinity マスクの大きさよりも小さい。
ESRCH
ID が thread のスレッドが見つからなかった。
 

バージョン

これらの関数は glibc バージョン 2.3.4 以降で提供されている。  

属性

この節で使用されている用語の説明については、 attributes(7) を参照。
インターフェース 属性 値
pthread_setaffinity_np(), pthread_getaffinity_np() Thread safety MT-Safe
 

準拠

これらの関数は非標準の GNU による拡張である。 そのため、名前に "_np" (nonportable; 移植性がない) という接尾辞が 付いている。  

注意

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 affinity マスクを継承する。  

例

以下のプログラムでは、メインスレッドは pthread_setaffinity_np() を使って自分の CPU affinity マスクに CPU 0 から 7 が含まれるように設定し (システム上には 0 から 7 に対応する CPU が全て存在するとは限らない)、 その後で pthread_getaffinity_np() を使って スレッドに実際に設定された CPU affinity マスクを確認している。

#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;
    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:\n");
    for (int j = 0; j < CPU_SETSIZE; j++)
        if (CPU_ISSET(j, &cpuset))
            printf("    CPU %d\n", j);


    exit(EXIT_SUCCESS); }  

関連項目

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

この文書について

この man ページは Linux man-pages プロジェクトのリリース 5.10 の一部である。プロジェクトの説明とバグ報告に関する情報は https://www.kernel.org/doc/man-pages/ に書かれている。

関連キーワード

pthread   setaffinity   スレッド   affinity   集合   getaffinity   cpuset   マスク   カーネル   thread   実際   define   制限   handle   size   成功   バッファー   マクロ   許可   プロセッサ   機構   適用   サポート   errno   exit

Linux マニュアル 一覧

関連するコマンド・関数

pthread_setaffinity_np.3   sched_getaffinity.2   sched_setaffinity.2   pthread_attr_getaffinity_np.3   pthread_attr_setaffinity_np.3   pthread_sigmask.3
 

Index

名前
書式
説明
返り値
エラー
バージョン
属性
準拠
注意
例
関連項目
この文書について

This document was created by man2html, using the manual pages.
Time: 04:39:17 GMT, October 11, 2026