名前
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 -スレッド生成時の属性
説明
スレッドの属性を設定するには、
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 。
関連項目
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 を返す。