スレッド・ライブラリー・オプション

この項では、スレッド、mutex、および条件変数の特殊な属性について説明します。

スレッド・ライブラリーの POSIX 標準は、 一部のパーツのインプリメンテーションをオプショナルとして指定します。 スレッド・ライブラリー API によって定義されたすべてのサブルーチンは、常に使用可能です。 使用可能オプションによっては、 いくつかのサブルーチンがインプリメントできない場合があります。 インプリメントできなかったサブルーチンは、 アプリケーションによって呼び出すことはできますが、 その場合、常に ENOSYS エラー・コードが戻ります。

スタック属性

スタックは、各スレッドごとに割り当てられます。 スタック管理はインプリメンテーションに依存するので、 以下の情報は AIX® だけに当てはまります。 ただし、類似の機能は他のシステムにも存在する可能性があります。

スタックは、スレッドの作成時に動的に割り当てられます。 拡張スレッド属性を使用すると、 ユーザーがスタックのサイズおよびアドレスを制御することが可能です。 次の情報は、システムによって作成される初期スレッドには当てはまりません。

スタック・サイズ

スタック・サイズ・オプションは、スレッド属性オブジェクトの stacksize 属性の制御を可能にします。 この属性は、作成されたスレッドに使用される最小スタック・サイズを指定します。

stacksize 属性は AIX で定義されます。 次の属性とサブルーチンは、オプションがインプリメントされているときに使用可能です。

stacksize 属性のデフォルト値は 96 KB です。 stacksize 属性の最小値は 16 KB です。 割り当てられた値が最小値より小さい場合、この最小値が割り当てられます。

AIX インプリメンテーションのスレッド・ライブラリーでは、 データのチャンク (ユーザー・スレッド領域 と呼ばれる) が作成されたスレッドごとに割り当てられます。 この領域は、次のセクションに分割されます。
  • レッド・ゾーン。 これは、スタック・オーバーフロー検出のための読み取り保護と書き込み保護の両方が実行されます。 ラージ・ページを使用するプログラムには、レッド・ゾーンがありません。
  • デフォルト・スタック。
  • pthread 構成。
  • スレッド構造体。
  • スレッド属性構造体。
注: ここで説明するユーザー・スレッド領域は、AIX カーネルで使用される uthread 構造体には関係ありません。 ユーザー・スレッド領域はユーザー・モードだけでアクセスされ、 スレッド・ライブラリーだけによって操作されますが、uthread 構造体はカーネル環境内部に存在しているだけです。

スタック・アドレス 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
pthread.h ヘッダー・ファイルは、 他のヘッダー・ファイルまたはプログラムで使用できる、次のシンボルを定義します。
_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
一般的なオプションを検査するには、次の Name パラメーター値を指定して sysconf サブルーチンを使用してください。
_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 シンボリック定数を使用して検索できます。

デフォルト属性値

スレッド属性オブジェクトのデフォルト値は、 以下のシンボリック定数によって、pthread.h ヘッダー・ファイル内に定義されています。
  • 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 属性のデフォルト値を指定します。