Manpages

名 前

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/ に 書 か れ て い る 。