スレッド・ライブラリー・オプション
この項では、スレッド、mutex、および条件変数の特殊な属性について説明します。
スレッド・ライブラリーの POSIX 標準は、 一部のパーツのインプリメンテーションをオプショナルとして指定します。 スレッド・ライブラリー API によって定義されたすべてのサブルーチンは、常に使用可能です。 使用可能オプションによっては、 いくつかのサブルーチンがインプリメントできない場合があります。 インプリメントできなかったサブルーチンは、 アプリケーションによって呼び出すことはできますが、 その場合、常に ENOSYS エラー・コードが戻ります。
スタック属性
スタックは、各スレッドごとに割り当てられます。 スタック管理はインプリメンテーションに依存するので、 以下の情報は AIX® だけに当てはまります。 ただし、類似の機能は他のシステムにも存在する可能性があります。
スタックは、スレッドの作成時に動的に割り当てられます。 拡張スレッド属性を使用すると、 ユーザーがスタックのサイズおよびアドレスを制御することが可能です。 次の情報は、システムによって作成される初期スレッドには当てはまりません。
スタック・サイズ
スタック・サイズ・オプションは、スレッド属性オブジェクトの stacksize 属性の制御を可能にします。 この属性は、作成されたスレッドに使用される最小スタック・サイズを指定します。
- スレッド属性オブジェクトの stacksize 属性。
- pthread_attr_getstacksize サブルーチンは、属性の値を戻します。
- pthread_attr_setstacksize サブルーチンは、値を設定します。
stacksize 属性のデフォルト値は 96 KB です。 stacksize 属性の最小値は 16 KB です。 割り当てられた値が最小値より小さい場合、この最小値が割り当てられます。
- レッド・ゾーン。 これは、スタック・オーバーフロー検出のための読み取り保護と書き込み保護の両方が実行されます。 ラージ・ページを使用するプログラムには、レッド・ゾーンがありません。
- デフォルト・スタック。
- pthread 構成。
- スレッド構造体。
- スレッド属性構造体。
スタック・アドレス POSIX オプション
スタック・アドレス・オプションは、スレッド属性オブジェクトの stackaddr 属性の制御を可能にします。 この属性によって、作成されたスレッドのスタックで使用されるストレージの位置を指定できます。
- スレッド属性オブジェクトの stackaddr 属性は、スレッドに割り当てられるスタックのアドレスを指定します。
- pthread_attr_getstackaddr サブルーチンは、属性の値を返します。
- また、pthread_attr_setstackaddr サブルーチンは、値を設定します。
スタック・アドレスが指定されていない場合、 そのスタックはシステムによって任意のアドレスに割り当てられます。 既知の位置にスタックを置く必要がある場合は、stackaddr 属性を使用することができます。 例えば、非常に大きいスタックが必要な場合、 割り当ての成功を確実化した上で、未使用セグメントにアドレスを設定することができます。
pthread_create サブルーチンの呼び出し時にスタック・アドレスが指定される場合、システムはそのアドレスにスタックを割り当てようとします。 これが失敗すると、pthread_create サブルーチンが EINVAL を戻します。 pthread_attr_setstackaddr サブルーチンは、 実際にスタックを割り当てるわけではないので、 指定されたスタック・アドレスがアドレッシング・スペースを超える場合だけ、エラーを戻します。
優先順位スケジューリング POSIX オプション
優先順位スケジューリング・オプションによって、 スレッド・レベルでの実行スケジューリングの制御が可能になります。 このオプションが使用不可なとき、プロセス内のすべてのスレッドがそのプロセスのスケジューリング属性を共用します。 このオプションが使用可能なとき、各スレッドは即時のスケジューリング属性を持ちます。 ローカル・コンテンション有効範囲スレッドの場合、 スケジューリング属性はライブラリー・スケジューラーによってプロセス・レベルで操作され、一方、 グローバル・コンテンション有効範囲スレッドの場合、 スケジューリング属性はカーネル・スケジューラーによってシステム・レベルで操作されます。
次の属性とサブルーチンは、オプションがインプリメントされているときに使用可能です。
- スレッド属性オブジェクトの inheritsched 属性
- スレッド属性オブジェクトおよびスレッドの schedparam 属性
- スレッド属性オブジェクトおよびスレッドの schedpolicy 属性
- スレッド属性オブジェクトおよびスレッドの contention-scope 属性
- pthread_attr_getschedparam および pthread_attr_setschedparam サブルーチン
- pthread_getschedparam サブルーチン
オプションの可用性の検査
オプションは、コンパイル時または実行時 に検査することができます。 移植可能プログラムでは、他のシステムに移植したときに書き直す必要がないように、 オプションを使用する前にその可用性を調べておく必要があります。
コンパイル時検査
#ifndef _POSIX_THREAD_ATTR_STACKSIZE
#error "The stack size POSIX option is required"
#endif- _POSIX_REENTRANT_FUNCTIONS
- 再入可能関数が必須であることを示します。
- _POSIX_THREADS
- スレッド・ライブラリーのインプリメンテーションを示します。
実行時検査
sysconf サブルーチンを使用すると、 プログラムが稼働しているシステムのオプションの可用性を取得することができます。 これは、AIX の 2 つのバージョンのように、 バイナリーの互換性のあるシステム間のプログラムの移植に有用です。
次のリストに示されているシンボルは、各オプションと関連し、sysconf サブルーチンの Name パラメーターに使用する必要があるものです。シンボリック定数は、 unistd.h ヘッダー・ファイル内に定義されています。
- スタック・アドレス
- _SC_THREAD_ATTR_STACKADDR
- スタック・サイズ
- _SC_THREAD_ATTR_STACKSIZE
- 優先順位スケジューリング
- _SC_THREAD_PRIORITY_SCHEDULING
- 優先順位継承
- _SC_THREAD_PRIO_INHERIT
- 優先順位保護
- _SC_THREAD_PRIO_PROTECT
- プロセス共用
- _SC_THREAD_PROCESS_SHARED
- _SC_REENTRANT_FUNCTIONS
- 再入可能関数が必須であることを示します。
- _SC_THREADS
- スレッド・ライブラリーのインプリメンテーションを示します。
プロセス共用
AIX および大部分の UNIX システムでは、複数のプロセスが共用メモリー と呼ばれる共通データ・スペースを共用できます。条件変数と mutex のプロセス共用属性は、これらのオブジェクトを共用メモリーに割り当てて、異なるプロセスに属するスレッドの間の同期をサポートできるように計画されています。ただし、共用メモリー管理のための業界標準インターフェースはないので、AIX スレッド・ライブラリーにプロセス共用 POSIX オプションはインプリメントされません。
スレッドのデータ型
- pthread_t
- スレッドを識別します。
- pthread_attr_t
- スレッド属性オブジェクトを識別します。
- pthread_cond_t
- 条件変数を識別します。
- pthread_condattr_t
- 条件属性オブジェクトを識別します。
- pthread_key_t
- スレッド固有データ・キーを識別します。
- pthread_mutex_t
- mutex を識別します。
- pthread_mutexattr_t
- mutex 属性オブジェクトを識別します。
- pthread_once_t
- ワンタイム初期化オブジェクトを識別します。
制限とデフォルト値
- プロセスごとのスレッドの最大数は 512 です。 スレッドの最大数は、コンパイル時に、 pthread.h ヘッダー・ファイルに定義されている PTHREAD_THREADS_MAX シンボリック定数を使用して検索できます。 -D_LARGE_THREADS フラグを指定してアプリケーションをコンパイルする場合、 プロセスごとのスレッドの最大数は 32767 です。
- スレッドの最小スタック・サイズは 8 K です。
デフォルトのスタック・サイズは 96 KB です。 この数値は、コンパイル時に、
pthread.h ヘッダー・ファイルで定義されている、
PTHREAD_STACK_MIN シンボリック定数を使用して検索できます。 注: 最大スタック・サイズは、セグメントのサイズの 256 MB です。 この制限は、pthread.h ヘッダー・ファイル内の PTHREAD_STACK_MAX シンボリック定数で示されます。
- スレッド固有データ・キーの最大数は、508 に制限されています。 この数値は、コンパイル時に、pthread.h ヘッダー・ファイルで 定義されている PTHREAD_KEYS_MAX シンボリック定数を使用して検索できます。
デフォルト属性値
- DEFAULT_DETACHSTATE シンボリック定数のデフォルト値は、PTHREAD_CREATE_DETACHED です。これは、detachstate 属性のデフォルト値を指定します。
- DEFAULT_JOINABLE シンボリック定数のデフォルト値は、PTHREAD_CREATE_JOINABLE です。 これは、結合可能状態のデフォルト値を指定します。
- DEFAULT_INHERIT シンボリック定数のデフォルト値は、PTHREAD_INHERIT_SCHED です。これは、inheritsched 属性のデフォルト値を指定します。
- DEFAULT_PRIO シンボリック定数のデフォルト値は 1 です。これは、schedparam 属性の sched_prio フィールドのデフォルト値を指定します。
- DEFAULT_SCHED シンボリック定数のデフォルト値は、SCHED_OTHER です。これは、スレッド属性オブジェクトの schedpolicy 属性のデフォルト値を指定します。
- DEFAULT_SCOPE シンボリック定数のデフォルト値は、PTHREAD_SCOPE_LOCAL です。これは、contention-scope 属性のデフォルト値を指定します。