__thread ストレージ・クラスは、静的変数をスレッド・ローカル・ストレージ期間を持つものとしてマークします。 つまり、マルチスレッド・アプリケーションでは、変数を使用するスレッドごとに変数の固有インスタンスが作成されて、スレッドの終了時に破棄されます。 __thread ストレージ・クラス指定子により、スレッド・セーフティーを容易に保証することができます。 スレッドごとにオブジェクトを宣言することで、スレッド同期化に関する低水準のプログラミングや大幅なプログラム再構築を必要とせずに、競合状態を心配しないで、複数のスレッドからオブジェクトにアクセスできます。
指定子には次のいずれかを適用することができます。
ブロック・スコープの自動変数および非静的データ・メンバーには適用できません。
以下の例のように、この指定子は、それ自身だけで使用するか、あるいは static または extern 指定子を直前に付加して使用することができます。
__thread int i; extern __thread struct state s; static __thread char *p;
__thread 指定子でマークされた変数は、初期化することも、未初期化にすることもできます。 __thread 変数は、定数式を使用して初期化する必要があり、静的コンストラクターを持ってはなりません。
address-of 演算子 (&) をスレッド・ローカル変数に適用すると、変数の現行スレッドのインスタンスの実行時アドレスが返されます。 そのスレッドは、このアドレスを任意の別のスレッドに渡すことができますが、 最初のスレッドが終了すると、そのスレッド・ローカル変数へのポインターはすべて無効になります。
関連情報