Go to main content
Oracle® Solaris 11.3 リンカーとライブラリガイド

印刷ビューの終了

更新: 2015 年 10 月
 
 

C/C++ プログラミングインタフェース

次の例に示すように、__thread キーワードを使用すると、変数をスレッド固有として宣言できます。

__thread int i;
__thread char *p;
__thread struct state s;

ループの最適化の際に、コンパイラは必要に応じてスレッド固有一時領域を作成することがあります。

適用性

__thread キーワードは任意の大域変数、ファイルスコープの静的変数、または関数スコープの静的変数に適用できます。常にスレッド固有である自動変数には影響を与えません。

初期化

C++ では、初期化に静的なコンストラクタが必要となる場合には、スレッド固有変数の初期化が行われないことがあります。静的なコンストラクタを必要としないかぎり、スレッド固有変数は通常の静的変数に有効な任意の値に初期化できます。

変数は、(スレッド固有であるかどうかにかかわらず) スレッド固有変数のアドレスに静的に初期化することはできません。

結合

スレッド固有変数の宣言と参照は外部的に行えます。スレッド固有変数は、通常のシンボルと同じ割り込み規則に従う必要があります。

動的なロードの制限

さまざまな TLS アクセスモデルを利用できます。スレッド固有ストレージのアクセスモデルを参照してください。共有オブジェクトを開発するときは、オブジェクトの読み込みに関連して一部のアクセスモデルに適用される制限に注意するようにしてください。共有オブジェクトは、プロセスの起動時に動的に読み込むことができ、またプロセスの起動後には、遅延読み込み、フィルタ、または dlopen(3C) によって、動的に読み込むことができます。プロセスの起動が完了すると、メインスレッドのスレッドポインタが確立されます。すべての静的な TLS ストレージ要件は、スレッドポインタが確立される前に計算されます。

スレッド固有変数を参照する共有オブジェクトでは、その参照を含むすべての変換ユニットは、動的な TLS モデルを使ってコンパイルするようにしてください。このアクセスモデルを使用すると、共有オブジェクトをもっとも柔軟に読み込むことができます。ただし、静的な TLS モデルを使用すると、コードの速度が向上します。静的な TLS モデルを使用する共有オブジェクトは、プロセスを初期化するときに読み込むことができます。ただし、プロセスを初期化したあとは、静的な TLS モデルを使用する共有オブジェクトのロードは、十分なバックアップ TLS ストレージが使用可能な場合にのみ実行できます。プログラムの起動を参照してください。

アドレス演算子

スレッド固有変数には、アドレス演算子 & を使用できます。この演算子は、実行時に評価されて、現在のスレッド内の変数のアドレスを返します。この演算子によって取得されたアドレスは、アドレスを評価したスレッドが存在するかぎり、プロセス内のあらゆるスレッドで自由に使用できます。スレッドが終了した時点で、そのスレッド内のスレッド固有変数を指すポインタはすべて無効になります。

スレッド固有変数のアドレスを取得するために dlsym(3C) を使用すると、dlsym() を呼び出したスレッド内におけるその変数のインスタンスのアドレスが返されます。