ナビゲーションリンクをスキップ | |
印刷ビューの終了 | |
リンカーとライブラリ Oracle Solaris 11 Information Library (日本語) |
パート IV ELF アプリケーションバイナリインタフェース
32 ビット SPARC: Initial Executable (IE)
64 ビット SPARC: Initial Executable (IE)
32 ビット x86: General Dynamic (GD)
32 ビット x86: Initial Executable (IE)
32 ビット x86: Local Executable (LE)
次の例に示すように、__thread キーワードを使用すると、変数をスレッド固有として宣言できます。
__thread int i; __thread char *p; __thread struct state s;
ループの最適化の際に、コンパイラは必要に応じてスレッド固有一時領域を作成することがあります。
C++ では、初期化に静的なコンストラクタが必要となる場合には、スレッド固有変数の初期化が行われないことがあります。静的なコンストラクタを必要としないかぎり、スレッド固有変数は通常の静的変数に有効な任意の値に初期化できます。
変数は、(スレッド固有であるかどうかにかかわらず) スレッド固有変数のアドレスに静的に初期化することはできません。
スレッド固有変数の宣言と参照は外部的に行えます。スレッド固有変数は、通常のシンボルと同じ割り込み規則に従う必要があります。
さまざまな TLS アクセスモデルを利用できます。「スレッド固有領域のアクセスモデル」を参照してください。共有オブジェクトを開発するときは、オブジェクトの読み込みに関連して一部のアクセスモデルに適用される制限に注意するようにしてください。共有オブジェクトは、プロセスの起動時に動的に読み込むことができ、またプロセスの起動後には、遅延読み込み、フィルタ、または dlopen(3C) によって、動的に読み込むことができます。プロセスの起動が完了すると、メインスレッドのスレッドポインタが確立されます。すべての静的な TLS 領域要件は、スレッドポインタが確立される前に計算されます。
スレッド固有変数を参照する共有オブジェクトでは、その参照を含むすべての変換ユニットは、動的な TLS モデルを使ってコンパイルするようにしてください。このアクセスモデルを使用すると、共有オブジェクトをもっとも柔軟に読み込むことができます。ただし、静的な TLS モデルを使用すると、コードの速度が向上します。静的な TLS モデルを使用する共有オブジェクトは、プロセスを初期化するときに読み込むことができます。ただし、プロセスを初期化したあとは、静的な TLS モデルを使用する共有オブジェクトの読み込みは、十分なバックアップ TLS 記憶域が使用可能な場合にのみ実行できます。「プログラムの起動」を参照してください。
スレッド固有変数には、アドレス演算子 & を使用できます。この演算子は、実行時に評価されて、現在のスレッド内の変数のアドレスを返します。この演算子によって取得されたアドレスは、アドレスを評価したスレッドが存在するかぎり、プロセス内のあらゆるスレッドで自由に使用できます。スレッドが終了した時点で、そのスレッド内のスレッド固有変数を指すポインタはすべて無効になります。
スレッド固有変数のアドレスを取得するために dlsym(3C) を使用すると、dlsym() を呼び出したスレッド内におけるその変数のインスタンスのアドレスが返されます。