スレッド
Microsoft 固有の仕様 →
thread 拡張ストレージ クラス修飾子は、スレッド ローカル変数を宣言するために使用されます。
__declspec( thread ) declarator
解説
スレッド ローカル ストレージ (TLS) は、特定のマルチスレッド プロセスの各スレッドが、スレッド固有のデータを格納するための場所を割り当てる機能です。 標準のマルチスレッド プログラムでは、データは特定のプロセスのすべてのスレッド間で共有されますが、スレッド ローカル ストレージはスレッドごとのデータを割り当てるための機能です。 スレッドの詳細については、マルチスレッドに関するトピックを参照してください。
スレッド ローカル変数の宣言では、拡張属性構文を使用し、__declspec キーワードを thread キーワードと共に使用する必要があります。 たとえば、次に示すコードは、整数型のスレッド ローカル変数を宣言して特定の値に初期化します。
__declspec( thread ) int tls_i = 1;
スレッド ローカルのオブジェクトおよび変数を宣言するときは、以下のガイドラインに従う必要があります。
thread 属性は、データ宣言とデータ定義、およびメンバー関数のないクラスのみに適用できます。thread を関数宣言や関数定義に使用することはできません。
thread 属性の使用は、DLL のインポートの遅延読み込みに干渉する可能性があります。
thread 属性は、静的ストレージ存続期間のあるデータ項目にのみ指定できます。 これには、グローバルなデータ オブジェクト (static と extern の両方)、ローカルな静的オブジェクト、クラスの静的データ メンバーなどが含まれます。 thread 属性を使用して自動データ オブジェクトを宣言することはできません。
宣言と定義が同じファイルと別々のファイルのどちらで発生する場合でも、スレッド ローカル オブジェクトの宣言と定義には thread 属性を使用する必要があります。
thread 属性を型修飾子として使用することはできません。
__declspec(thread) を使用してインスタンス化できるのは、POD クラスだけです。 スレッド属性は、クラス宣言の一部としてオブジェクトが宣言されていない場合は無視されます。 次に例を示します。
// declspec_thread.cpp // compile with: /LD __declspec(thread) class X { public: int I; } x; // x is a thread object X y; // y is not a thread object
thread 属性を使用するオブジェクトの宣言は許可されるので、次の 2 つの例は同じ意味になります。
// declspec_thread_2.cpp // compile with: /LD __declspec( thread ) class B { public: int data; } BObject; // BObject declared thread local. class B2 { public: int data; }; __declspec( thread ) B2 BObject2; // BObject2 declared thread local.
標準 C では、自分自身への参照を含む式でオブジェクトや変数を初期化できます。ただし、この場合のオブジェクトは、非静的なものに限られます。 C++ では、通常、自分自身への参照を含む式でこのようにオブジェクトを動的に初期化できますが、この種の初期化はスレッド ローカル オブジェクトでは許可されません。 次に例を示します。
// declspec_thread_3.cpp // compile with: /LD #define Thread __declspec( thread ) int j = j; // Okay in C++; C error Thread int tls_i = sizeof( tls_i ); // Okay in C and C++
初期化されるオブジェクトが含まれる sizeof 式は、そのオブジェクト自体への参照が発生しないので、C と C++ の両方で有効になります。
END Microsoft 固有の仕様