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_setattrname で個別に設定したり、 pthread_attr_getattrname で個別に取得したりすることが可能である。
pthread_attr_destroy はスレッド属性オブジェクトを破壊する。 破壊したオブジェクトは、再初期化するまでは 再び使用してはならない。 pthread_attr_destroy は LinuxThreads の実装では何もしない。
属性オブジェクトは新しいスレッドを生成するときにだけ参照される。 複数のスレッドの生成に同じ属性オブジェクトを使用することもできる。 pthread_create の呼び出しの後に属性オブジェクトを変更しても、 すでに生成されたスレッドの属性は変化しない。
次のようなスレッド属性に対応している:
スレッドが合流可能な状態で生成される ( PTHREAD_CREATE_JOINABLE) か、デタッチ状態で生成される ( PTHREAD_CREATE_DETACHED) かを制御する。
デフォルト値: PTHREAD_CREATE_JOINABLE 。
合流可能な状態の場合、 別のスレッドが pthread_join(3) を呼び出すことによって、そのスレッドの終了に同期して 終了コードを取得することができる。 しかし、スレッドの資源の一部はスレッドが終了した後も 確保されたまま残り、 別のスレッドがそのスレッドに対して pthread_join(3) を呼び出したときに限って解放される。
デタッチ状態の場合、スレッドの資源は終了した時に直ちに解放される。 しかし、 pthread_join(3) を使用してスレッドの終了に同期することはできない。
合流可能な状態で生成されたスレッドは、 pthread_detach(3) を呼び出してデタッチスレッドに変更することができる。
スレッドのスケジューリングポリシーを選択する。 とりうる値は SCHED_OTHER (通常の、リアルタイムでないスケジューリング) 、 SCHED_RR (ラウンドロビン方式のリアルタイムスケジューリング) 、 SCHED_FIFO (先入れ先出し (FIFO) 方式のリアルタイムスケジューリング) のいずれかである。 スケジューリングポリシーに関するさらなる情報については sched_setpolicy(2) を参照のこと。
デフォルト値: SCHED_OTHER 。
リアルタイムスケジューリングポリシーである SCHED_RR と SCHED_FIFO は、スーパーユーザ権限のプロセスに限って使用できる。
スレッドのスケジューリングポリシーは、 生成後に pthread_setschedparam(3) を用いて変更することができる。
スレッドのスケジューリングパラメータ (特に、スケジューリング優先度) を 指定する。 スケジューリングパラメータに関するさらなる情報については sched_setparam(2) を参照のこと。
デフォルト値: 優先度は 0 。
この属性はスケジューリングポリシーが SCHED_OTHER の時には意味を持たず、 リアルタイムポリシー SCHED_RR と SCHED_FIFO に対してのみ有効である。
スレッドのスケジューリング優先度は、 生成後に pthread_setschedparam(3) を用いて変更することができる。
新しく生成されるスレッドの スケジューリングポリシーとスケジューリングパラメータが 属性 schedpolicy および schedparam の値で決定される ( PTHREAD_EXPLICIT_SCHED) か、親スレッドから継承される ( PTHREAD_INHERIT_SCHED) かを指定する。
デフォルト値: PTHREAD_EXPLICIT_SCHED 。
生成されるスレッドのスケジューリング競争スコープを定義する。 LinuxThreads の実装で唯一対応している値は PTHREAD_SCOPE_SYSTEM で、 スレッドは同じ計算機で実行中のすべてのプロセスと CPU 時間を取り合う。 詳しくいえば、スレッドの優先度は計算機上の他のすべてのプロセスの優先度と 同列のものと解釈される。 POSIX 標準で規定されるもう 1 つの値 PTHREAD_SCOPE_PROCESS は、 スケジューリングの競争は実行中のプロセス中のスレッド間だけで 起こることを意味する。 すなわち、スレッドの優先度はプロセス中の他のスレッドの優先度と 同列のものと解釈され、他のプロセスの優先度とは関わりがない。 LinuxThreads は PTHREAD_SCOPE_PROCESS に対応していない。
デフォルト値: PTHREAD_SCOPE_SYSTEM 。
すべての関数は成功すると 0 を返し、 エラーならば非 0 のエラーコードを返す。 成功の場合、 関数群 pthread_attr_getattrname は属性 attrname の現在の値を第 2 引数で指し示される領域に格納する。
関数 pthread_attr_setdetachstate はエラーの場合、次のようなエラーコードを返す:
関数 pthread_attr_setschedparam はエラーの場合、次のようなエラーコードを返す:
関数 pthread_attr_setschedpolicy はエラーの場合次のようなエラーコードを返す:
関数 pthread_attr_setinheritsched はエラーの場合次のようなエラーコードを返す:
関数 pthread_attr_setscope はエラーの場合次のようなエラーコードを返す:
[訳注] 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);
int pthread_attr_setstacksize(pthread_attr_t *attr, size_t stacksize);
int pthread_attr_getstacksize(const pthread_attr_t *attr, size_t *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);
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);
スレッドが独自のスタックを使用している場合( stackaddr 属性が設定されている場合) 、 guardsize 属性は無視される。
指定した値が stacksize を超える場合、 pthread_attr_setguardsize は失敗し、 EINVAL を返す。