pthread_attr_init - ライブラリコールの説明 - Linux コマンド集 一覧表
名前
pthread_attr_init, pthread_attr_destroy, pthread_attr_setdetachstate, pthread_attr_getdetachstate,
pthread_attr_setschedparam, pthread_attr_getschedparam, pthread_attr_setschedpolicy, pthread_attr_getschedpolicy,
pthread_attr_setinheritsched, pthread_attr_getinheritsched, pthread_attr_setscope, pthread_attr_getscope
- スレッド生成時の属性
書式
#include <pthread.h>
int pthread_attr_init(pthread_attr_t *
attr
);
int pthread_attr_destroy(pthread_attr_t *
attr
);
int pthread_attr_setdetachstate(pthread_attr_t *
attr
, int
detachstate
);
int pthread_attr_getdetachstate(const pthread_attr_t *
attr
, int *
detachstate
);
int pthread_attr_setschedpolicy(pthread_attr_t *
attr
, int
policy
);
int pthread_attr_getschedpolicy(const pthread_attr_t *
attr
, int *
policy
);
int pthread_attr_setschedparam(pthread_attr_t *
attr
, const struct sched_param *
param
);
int pthread_attr_getschedparam(const pthread_attr_t *
attr
, struct sched_param *
param
);
int pthread_attr_setinheritsched(pthread_attr_t *
attr
, int
inherit
);
int pthread_attr_getinheritsched(const pthread_attr_t *
attr
, int *
inherit
);
int pthread_attr_setscope(pthread_attr_t *
attr
, int
scope
);
int pthread_attr_getscope(const pthread_attr_t *
attr
, int *
scope
);
説明
スレッドの属性を設定するには、
"pthread_attr_t"
型のスレッド属性オブジェクト
"attr"
に値を格納し、
pthread_create
(3) の第 2 引数として渡せばよい。
"NULL"
を渡すことは、
すべての属性がデフォルトに設定されたスレッド属性オブジェクトを
渡すのと同等である。
"pthread_attr_init"
はスレッド属性オブジェクト
"attr"
を初期化して、各属性のデフォルトの値を格納する。
( 各属性のデフォルト値は下を参照のこと。 )
それぞれの属性
"attrname"
( 全属性のリストは下を参照のこと ) は、
関数
pthread_attr_set
attrname
で個別に設定したり、
pthread_attr_get
attrname
で個別に取得したりすることが可能である。
"pthread_attr_destroy"
はスレッド属性オブジェクトを破壊する。
破壊したオブジェクトは、再初期化するまでは
再び使用してはならない。
"pthread_attr_destroy"
は LinuxThreads の実装では何もしない。
属性オブジェクトは新しいスレッドを生成するときにだけ参照される。
複数のスレッドの生成に同じ属性オブジェクトを使用することもできる。
"pthread_create"
の呼び出しの後に属性オブジェクトを変更しても、
すでに生成されたスレッドの属性は変化しない。
次のようなスレッド属性に対応している:
detachstate (デタッチ状態)
スレッドが合流可能な状態で生成される (
PTHREAD_CREATE_JOINABLE
)か、デタッチ状態で生成される (
PTHREAD_CREATE_DETACHED
)かを制御する。
デフォルト値:
"PTHREAD_CREATE_JOINABLE"
。
合流可能な状態の場合、
別のスレッドが
pthread_join
(3) を呼び出すことによって、そのスレッドの終了に同期して
終了コードを取得することができる。
しかし、スレッドの資源の一部はスレッドが終了した後も
確保されたまま残り、
別のスレッドがそのスレッドに対して
pthread_join
(3) を呼び出したときに限って解放される。
デタッチ状態の場合、スレッドの資源は終了した時に直ちに解放される。
しかし、
pthread_join
(3) を使用してスレッドの終了に同期することはできない。
合流可能な状態で生成されたスレッドは、
pthread_detach
(3) を呼び出してデタッチスレッドに変更することができる。
schedpolicy (スケジューリングポリシー)
スレッドのスケジューリングポリシーを選択する。
とりうる値は
"SCHED_OTHER"
(通常の、リアルタイムでないスケジューリング) 、
"SCHED_RR"
(ラウンドロビン方式のリアルタイムスケジューリング) 、
"SCHED_FIFO"
(先入れ先出し (FIFO) 方式のリアルタイムスケジューリング) のいずれかである。
スケジューリングポリシーに関するさらなる情報については
sched_setpolicy
(2)を参照のこと。
デフォルト値:
"SCHED_OTHER"
。
リアルタイムスケジューリングポリシーである
"SCHED_RR"
と
"SCHED_FIFO"
は、スーパーユーザ権限のプロセスに限って使用できる。
スレッドのスケジューリングポリシーは、
生成後に
pthread_setschedparam
(3) を用いて変更することができる。
schedparam (スケジューリングパラメータ)
スレッドのスケジューリングパラメータ (特に、スケジューリング優先度) を
指定する。
スケジューリングパラメータに関するさらなる情報については
sched_setparam
(2) を参照のこと。
デフォルト値: 優先度は 0 。
この属性はスケジューリングポリシーが
SCHED_OTHER
の時には意味を持たず、
リアルタイムポリシー
"SCHED_RR"
と
"SCHED_FIFO"
に対してのみ有効である。
スレッドのスケジューリング優先度は、
生成後に
pthread_setschedparam
(3) を用いて変更することができる。
inheritsched (スケジューリングの継承)
新しく生成されるスレッドの
スケジューリングポリシーとスケジューリングパラメータが
属性
"schedpolicy"
および
"schedparam"
の値で決定される (
PTHREAD_EXPLICIT_SCHED
)か、親スレッドから継承される (
PTHREAD_INHERIT_SCHED
)かを指定する。
デフォルト値:
"PTHREAD_EXPLICIT_SCHED"
。
scope (スコープ)
生成されるスレッドのスケジューリング競争スコープを定義する。
LinuxThreads の実装で唯一対応している値は
"PTHREAD_SCOPE_SYSTEM"
で、
スレッドは同じ計算機で実行中のすべてのプロセスと CPU 時間を取り合う。
詳しくいえば、スレッドの優先度は計算機上の他のすべてのプロセスの優先度と
同列のものと解釈される。
POSIX 標準で規定されるもう 1 つの値
"PTHREAD_SCOPE_PROCESS"
は、
スケジューリングの競争は実行中のプロセス中のスレッド間だけで
起こることを意味する。
すなわち、スレッドの優先度はプロセス中の他のスレッドの優先度と
同列のものと解釈され、他のプロセスの優先度とは関わりがない。
LinuxThreads は
"PTHREAD_SCOPE_PROCESS"
に対応していない。
デフォルト値:
"PTHREAD_SCOPE_SYSTEM"
。
返り値
すべての関数は成功すると 0 を返し、
エラーならば非 0 のエラーコードを返す。
成功の場合、
関数群
pthread_attr_get
attrname
は属性
"attrname"
の現在の値を第 2 引数で指し示される領域に格納する。
エラー
関数
"pthread_attr_setdetachstate"
はエラーの場合、次のようなエラーコードを返す:
- "EINVAL"
-
指定された
"detachstate"
が
"PTHREAD_CREATE_JOINABLE"
および
PTHREAD_CREATE_DETACHED
のいずれでもない。
関数 "pthread_attr_setschedparam" はエラーの場合、次のようなエラーコードを返す:
- "EINVAL"
-
"param"
で指定された優先度が
現在の
"attr"
のスケジューリングポリシーに対する許容範囲 (
"SCHED_FIFO"
および
"SCHED_RR"
の場合は 1 から 99 まで、
"SCHED_OTHER"
の場合は 0 のみ )
を超えている。
関数 "pthread_attr_setschedpolicy" はエラーの場合次のようなエラーコードを返す:
- "EINVAL"
-
指定された
"policy"
が
"SCHED_OTHER"
および
"SCHED_FIFO"
、
"SCHED_RR"
のいずれでもない
- "ENOTSUP"
-
"policy"
が
"SCHED_FIFO"
または
"SCHED_RR"
であって、呼び出しプロセスの実効ユーザがスーパーユーザではない。
関数 "pthread_attr_setinheritsched" はエラーの場合次のようなエラーコードを返す:
- "EINVAL"
-
指定された
"inherit"
が
"PTHREAD_INHERIT_SCHED"
および
"PTHREAD_EXPLICIT_SCHED"
のいずれでもない。
関数 "pthread_attr_setscope" はエラーの場合次のようなエラーコードを返す:
- "EINVAL"
-
指定された
"scope"
が
"PTHREAD_SCOPE_SYSTEM"
および
"PTHREAD_SCOPE_PROCESS"
のいずれでもない。
- "ENOTSUP"
-
指定された
"scope"
が
"PTHREAD_SCOPE_PROCESS"
(未対応) である。
著者
Xavier Leroy <Xavier.Leroy@inria.fr>
関連項目
pthread_create
(3),
pthread_join
(3),
pthread_detach
(3),
pthread_setschedparam
(3).
[訳注] glibc-linuxthreads の最新のドキュメントは Texinfo形式で提供されている。
以下は glibc-linuxthreads-2.3.1 の Texinfo ファイルからの引用で、
「説明」に追記されている。
glibc-linuxthreads-2.1 以降 guardsize および stackaddr 、 stacksize が、
glibc-linuxthreads-2.2 以降 stack が追加された。
int pthread_attr_setstackaddr(pthread_attr_t *
attr
, void *
stackaddr
);
int pthread_attr_getstackaddr(const pthread_attr_t *
attr
, void **
stackaddr
);
stackaddr (スタックアドレス)
アプリケーション管理スタックのアドレスを指定する。
スタックのサイズは
"PTHREAD_STACK_MIN"
以上でなければならない。
int pthread_attr_setstacksize(pthread_attr_t *
attr
, size_t
stacksize");"
int pthread_attr_getstacksize(const pthread_attr_t *
attr
, size_t *
stacksize
);
stacksize (スタックサイズ)
スレッドに対して確保されるスタックのサイズを変更する。
最小スタックサイズが指定した値に設定される。単位はバイトである。
指定した値がシステムの最大スタックサイズを超える場合、
または
"PTHREAD_STACK_MIN"
よりも小さい場合、
"pthread_attr_setstacksize"
は失敗し、
"EINVAL"
を返す。
int pthread_attr_setstack(pthread_attr_t *
attr
, void *
stackaddr
, size_t
stacksize
);
int pthread_attr_getstack(const pthread_attr_t *
attr
, void **
stackaddr
, size_t *
stacksize
);
stack (スタック)
生成されるスレッドに用いられるアプリケーション管理スタックの
アドレスとサイズの両方を指定する。
メモリ領域のベースを
"stackaddr"
に、メモリ領域のサイズをバイト単位で
"stacksize"
に指定する。
"stacksize"
の値が
"PTHREAD_STACK_MIN"
よりも小さいか、
システムの最大スタックサイズを超える場合、
または
"stackaddr"
の値が適切なアライメントでない場合、
"pthread_attr_setstack"
は失敗し、
"EINVAL"
を返す。
int pthread_attr_setguardsize(pthread_attr_t *
attr
, size_t
guardsize
);
int pthread_attr_getguardsize(const pthread_attr_t *
attr
, size_t *
guardsize
);
guardsize (保護サイズ)
スレッドのスタックの保護領域の最小のサイズをバイト単位で変更する。
デフォルトのサイズは 1 ページである。
この値が設定された場合、指定した値以上の最も近いページサイズに丸められる。
この値が 0 に設定された場合、このスレッドには保護領域は作成されない。
保護領域として確保された領域は、スタックオーバーフローを検出するのに
用いられる。したがって、大きな構造体の領域をスタック内に確保する場合、
スタックオーバーフローを検出するためにはそれよりも
大きい保護領域を指定する必要がある。
スレッドが独自のスタックを使用している場合(
"stackaddr"
属性が設定されている場合) 、
"guardsize"
属性は無視される。
指定した値が
"stacksize"
を超える場合、
"pthread_attr_setguardsize"
は失敗し、
"EINVAL"
を返す。