スレッド

 

公開日: 2016年7月

Visual Studio 2017 RC の最新のドキュメントの詳細については、Visual Studio 2017 RC ドキュメントをご参照ください。

Microsoft 固有の仕様 →

thread 拡張ストレージ クラス修飾子は、スレッド ローカル変数を宣言するために使用されます。 C++11 における移植可能な等価のものとして、thread_local ストレージ クラス指定子を使用します。

  
__declspec( thread ) declarator  

スレッド ローカル ストレージ (TLS) は、特定のマルチスレッド プロセスの各スレッドが、スレッド固有のデータを格納するための場所を割り当てる機能です。 標準のマルチスレッド プログラムでは、データは特定のプロセスのすべてのスレッド間で共有されますが、スレッド ローカル ストレージはスレッドごとのデータを割り当てるための機能です。 スレッドの詳細については、マルチスレッドに関するトピックを参照してください。

スレッド ローカル変数の宣言では、拡張属性構文を使用し、__declspec キーワードを thread キーワードと共に使用する必要があります。 たとえば、次に示すコードは、整数型のスレッド ローカル変数を宣言して特定の値に初期化します。

__declspec( thread ) int tls_i = 1;  

スレッド ローカルのオブジェクトおよび変数を宣言するときは、以下のガイドラインに従う必要があります。

  • thread 属性は、クラスおよびデータの宣言と定義のみに適用できます。thread を関数宣言や関数定義に使用することはできません。

  • thread 属性の使用は、DLL のインポートの遅延読み込みに干渉する可能性があります。

  • XP システムでは、DLL が __declspec(thread) のデータを使用して、データが LoadLibrary 経由で動的に読み込まれる場合、thread は正常に機能しないことがあります。

  • thread 属性は、静的ストレージ存続期間のあるデータ項目にのみ指定できます。 これには、グローバルなデータ オブジェクト (staticextern の両方)、ローカルな静的オブジェクト、クラスの静的データ メンバーなどが含まれます。 thread 属性を使用して自動データ オブジェクトを宣言することはできません。

  • 宣言と定義が同じファイルと別々のファイルのどちらで発生する場合でも、スレッド ローカル オブジェクトの宣言と定義には thread 属性を使用する必要があります。

  • thread 属性を型修飾子として使用することはできません。

  • 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 固有の仕様

__declspec
C++ キーワード
スレッド ローカル ストレージ (TLS: Thread Local Storage)

表示: