名 前
pthread_attr_init, pthread_attr_destroy − ス レ ッ ド 属 性 オ ブ ジ ェ ク ト の 初 期 化 と 破 棄 を 行 う
書 式
#include <pthread.h>
int
pthread_attr_init(pthread_attr_t *attr);
int pthread_attr_destroy(pthread_attr_t
*attr);
−pthread で コ ン パ イ ル し て リ ン ク す る 。
説 明
pthread_attr_init() 関 数 は attr が 指 す ス レ ッ ド 属 性 オ ブ ジ ェ ク ト (thread attributes object) を デ フ ォ ル ト の 属 性 値 で 初 期 化 す る 。 こ の 呼 び 出 し の 後 、 オ ブ ジ ェ ク ト の 各 属 性 は (関 連 項 目 に 載 っ て い る ) 種 々 の 関 数 を 使 っ て 設 定 す る こ と が で き 、 こ の オ ブ ジ ェ ク ト は ス レ ッ ド の 作 成 を 行 う pthread_create(3) の 呼 び 出 し に お い て 使 用 す る こ と が で き る (一 つ の オ ブ ジ ェ ク ト を 複 数 の pthread_create(3) に 渡 し て も よ い )。 す で に 初 期 化 さ れ て い る ス レ ッ ド 属 性 オ ブ ジ ェ ク ト に 対 し て pthread_attr_init() を 呼 び 出 し た 場 合 、 ど の よ う な 動 作 に な る か は 不 定 で あ る 。 ス レ ッ ド 属 性 オ ブ ジ ェ ク ト が も は や 必 要 な く な っ た 際 に は 、 そ の オ ブ ジ ェ ク ト は pthread_attr_destroy() 関 数 を 使 っ て 破 棄 す べ き で あ る 。 ス レ ッ ド 属 性 オ ブ ジ ェ ク ト を 破 棄 し て も 、 そ の オ ブ ジ ェ ク ト を 使 っ て 作 成 さ れ た ス レ ッ ド に は 影 響 は な い 。 い っ た ん 破 棄 し た ス レ ッ ド 属 性 オ ブ ジ ェ ク ト は 、 pthread_attr_init() を 使 っ て 再 初 期 化 す る こ と が で き る 。 破 棄 し た ス レ ッ ド 属 性 オ ブ ジ ェ ク ト を こ れ 以 外 の 用 途 で 使 っ た 場 合 の 結 果 は 不 定 で あ る 。
返 り 値
成 功 す る と 、 こ れ ら の 関 数 は 0 を 返 す 。 エ ラ ー の 場 合 、 0 以 外 の エ ラ ー 番 号 を 返 す 。
エ ラ ー
POSIX.1−2001 で は pthread_attr_init() に は エ ラ ー ENOMEM が 記 載 さ れ て い る 。 Linux で は 、 こ れ ら の 関 数 は 常 に 成 功 す る (た だ し 、 移 植 性 や 将 来 も 動 作 す る こ と を 保 証 し た い ア プ リ ケ ー シ ョ ン で は 正 の エ ラ ー の 返 り 値 を 処 理 す る よ う に す べ き で あ る )。
準 拠
POSIX.1−2001.
注 意
pthread_attr_t 型 の 内 部 構 造 は 意 識 す べ き で は な い 。 pthreads 関 数 経 由 以 外 で の オ ブ ジ ェ ク ト へ の ア ク セ ス は 移 植 性 が な く 、 ど の よ う な 結 果 が 得 ら れ る か も 分 か ら な い 。
例
下 記 の プ ロ グ ラ ム は 、 pthread_attr_init() と 種 々 の 関 連 関 数 を 使 っ て 、 ス レ ッ ド 属 性 オ ブ ジ ェ ク ト の 初 期 化 を 行 い 、 そ の オ ブ ジ ェ ク ト を 使 っ て ス レ ッ ド を 一 つ 作 成 す る 。 作 成 さ れ た ス レ ッ ド は 、 作 成 後 に pthread_getattr_np(3) 関 数 (非 標 準 の GNU 拡 張 ) を 使 っ て ス レ ッ ド の 属 性 を 取 得 し 、 取 得 し た 属 性 を 表 示 す る 。 コ マ ン ド ラ イ ン 引 き 数 な し で プ ロ グ ラ ム を 実 行 し た 場 合 、 pthread_create(3) の attr 引 き 数 に は NULL が 渡 さ れ る 。 こ の 場 合 、 ス レ ッ ド は デ フ ォ ル ト の 属 性 で 作 成 さ れ る 。 こ の プ ロ グ ラ ム を NPTL ス レ ッ ド 実 装 が 使 わ れ て い る Linux/x86−32 で 動 作 さ せ る と 、 以 下 の よ う な 出 力 が 得 ら れ る 。
$ ulimit
−s # No stack limit ==> default stack size is
2MB
unlimited
$ ./a.out
Thread attributes:
Detach state = PTHREAD_CREATE_JOINABLE
Scope = PTHREAD_SCOPE_SYSTEM
Inherit scheduler = PTHREAD_INHERIT_SCHED
Scheduling policy = SCHED_OTHER
Scheduling priority = 0
Guard size = 4096 bytes
Stack address = 0x40196000
Stack size = 0x201000 bytes コ マ ン
ド ラ イ ン 引 き
数 で ス タ ッ ク
サ イ ズ が 与 え
ら れ た 場 合 、
こ の プ ロ グ ラ
ム は 、 ス レ ッ
ド 属 性 オ ブ ジ
ェ ク ト を 初 期
化 し 、 そ の オ
ブ ジ ェ ク ト の
各 種 属 性 を 設
定 し 、 pthread_create(3) の
呼 び 出 し で こ
の オ ブ ジ ェ ク
ト へ の ポ イ ン
タ ー を 渡 す 。
こ の プ ロ グ ラ
ム を NPTL ス レ ッ ド
実 装 が 使 わ れ
て い る Linux/x86−32 で
動 作 さ せ る と
、 以 下 の よ う
な 出 力 が 得 ら
れ る 。
$ ./a.out
0x3000000
posix_memalign() allocated at 0x40197000
Thread attributes:
Detach state = PTHREAD_CREATE_DETACHED
Scope = PTHREAD_SCOPE_SYSTEM
Inherit scheduler = PTHREAD_EXPLICIT_SCHED
Scheduling policy = SCHED_OTHER
Scheduling priority = 0
Guard size = 0 bytes
Stack address = 0x40197000
Stack size = 0x3000000 bytes プ ロ グ
ラ ム の ソ ー
ス
#define _GNU_SOURCE /* To get
pthread_getattr_np() declaration */
#include <pthread.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <errno.h>
#define
handle_error_en(en, msg) \
do { errno = en; perror(msg); exit(EXIT_FAILURE); } while
(0)
static void
display_pthread_attr(pthread_attr_t *attr, char *prefix)
{
int s, i;
size_t v;
void *stkaddr;
struct sched_param sp;
s =
pthread_attr_getdetachstate(attr, &i);
if (s != 0)
handle_error_en(s, "pthread_attr_getdetachstate");
printf("%sDetach state = %s\n", prefix,
(i == PTHREAD_CREATE_DETACHED) ?
"PTHREAD_CREATE_DETACHED" :
(i == PTHREAD_CREATE_JOINABLE) ?
"PTHREAD_CREATE_JOINABLE" :
"???");
s =
pthread_attr_getscope(attr, &i);
if (s != 0)
handle_error_en(s, "pthread_attr_getscope");
printf("%sScope = %s\n", prefix,
(i == PTHREAD_SCOPE_SYSTEM) ?
"PTHREAD_SCOPE_SYSTEM" :
(i == PTHREAD_SCOPE_PROCESS) ?
"PTHREAD_SCOPE_PROCESS" :
"???");
s =
pthread_attr_getinheritsched(attr, &i);
if (s != 0)
handle_error_en(s,
"pthread_attr_getinheritsched");
printf("%sInherit scheduler = %s\n", prefix,
(i == PTHREAD_INHERIT_SCHED) ?
"PTHREAD_INHERIT_SCHED" :
(i == PTHREAD_EXPLICIT_SCHED) ?
"PTHREAD_EXPLICIT_SCHED" :
"???");
s =
pthread_attr_getschedpolicy(attr, &i);
if (s != 0)
handle_error_en(s, "pthread_attr_getschedpolicy");
printf("%sScheduling policy = %s\n", prefix,
(i == SCHED_OTHER) ? "SCHED_OTHER" :
(i == SCHED_FIFO) ? "SCHED_FIFO" :
(i == SCHED_RR) ? "SCHED_RR" :
"???");
s =
pthread_attr_getschedparam(attr, &sp);
if (s != 0)
handle_error_en(s, "pthread_attr_getschedparam");
printf("%sScheduling priority = %d\n", prefix,
sp.sched_priority);
s =
pthread_attr_getguardsize(attr, &v);
if (s != 0)
handle_error_en(s, "pthread_attr_getguardsize");
printf("%sGuard size = %d bytes\n", prefix,
v);
s =
pthread_attr_getstack(attr, &stkaddr, &v);
if (s != 0)
handle_error_en(s, "pthread_attr_getstack");
printf("%sStack address = %p\n", prefix, stkaddr);
printf("%sStack size = 0x%x bytes\n", prefix, v);
}
static void *
thread_start(void *arg)
{
int s;
pthread_attr_t gattr;
/*
pthread_getattr_np() is a non−standard GNU extension
that
retrieves the attributes of the thread specified in its
first argument */
s =
pthread_getattr_np(pthread_self(), &gattr);
if (s != 0)
handle_error_en(s, "pthread_getattr_np");
printf("Thread
attributes:\n");
display_pthread_attr(&gattr, "\t");
exit(EXIT_SUCCESS); /* Terminate all threads */ }
int
main(int argc, char *argv[])
{
pthread_t thr;
pthread_attr_t attr;
pthread_attr_t *attrp; /* NULL or &attr */
int s;
attrp = NULL;
/* If a
command−line argument was supplied, use it to set the
stack−size attribute and set a few other thread
attributes,
and set attrp pointing to thread attributes object */
if (argc >
1) {
int stack_size;
void *sp;
attrp = &attr;
s =
pthread_attr_init(&attr);
if (s != 0)
handle_error_en(s, "pthread_attr_init");
s =
pthread_attr_setdetachstate(&attr,
PTHREAD_CREATE_DETACHED);
if (s != 0)
handle_error_en(s,
"pthread_attr_setdetachstate");
s =
pthread_attr_setinheritsched(&attr,
PTHREAD_EXPLICIT_SCHED);
if (s != 0)
handle_error_en(s,
"pthread_attr_setinheritsched");
stack_size = strtoul(argv[1], NULL, 0);
s =
posix_memalign(&sp, sysconf(_SC_PAGESIZE), stack_size);
if (s != 0)
handle_error_en(s, "posix_memalign");
printf("posix_memalign() allocated at %p\n", sp);
s =
pthread_attr_setstack(&attr, sp, stack_size);
if (s != 0)
handle_error_en(s, "pthread_attr_setstack"); }
s =
pthread_create(&thr, attrp, &thread_start, NULL);
if (s != 0)
handle_error_en(s, "pthread_create");
if (attrp !=
NULL) {
s = pthread_attr_destroy(attrp);
if (s != 0)
handle_error_en(s, "pthread_attr_destroy"); }
pause(); /* Terminates when other thread calls exit() */ }
関 連 項 目
pthread_attr_setaffinity_np(3), pthread_attr_setdetachstate(3), pthread_attr_setguardsize(3), pthread_attr_setinheritsched(3), pthread_attr_setschedparam(3), pthread_attr_setschedpolicy(3), pthread_attr_setscope(3), pthread_attr_setstack(3), pthread_attr_setstackaddr(3), pthread_attr_setstacksize(3), pthread_create(3), pthread_getattr_np(3), pthreads(7)
こ の 文 書 に つ い て
こ の man ペ ー ジ は Linux man−pages プ ロ ジ ェ ク ト の リ リ ー ス 3.79 の 一 部 で あ る 。 プ ロ ジ ェ ク ト の 説 明 と バ グ 報 告 に 関 す る 情 報 は http://www.kernel.org/doc/man−pages/ に 書 か れ て い る 。