スレッドthread

Microsoft 固有の仕様Microsoft Specific

スレッド拡張ストレージ クラス修飾子は、スレッド ローカル変数を宣言するために使用します。The thread extended storage-class modifier is used to declare a thread local variable. C++ 11 で同等およびそれ以降のノートブックを使用して、 thread_local移植可能なコードのストレージ クラス指定子。For the portable equivalent in C++11 and later, use the thread_local storage class specifier for portable code. Windows でthread_localは実装されて _declspecします。On Windows thread_local is implemented with __declspec(thread).

構文Syntax

__declspec( thread ) declarator__declspec( thread ) declarator

RemarksRemarks

スレッド ローカル ストレージ (TLS) は、特定のマルチスレッド プロセスの各スレッドが、スレッド固有のデータを格納するための場所を割り当てる機能です。Thread Local Storage (TLS) is the mechanism by which each thread in a multithreaded process allocates storage for thread-specific data. 標準のマルチスレッド プログラムでは、データは特定のプロセスのすべてのスレッド間で共有されますが、スレッド ローカル ストレージはスレッドごとのデータを割り当てるための機能です。In standard multithreaded programs, data is shared among all threads of a given process, whereas thread local storage is the mechanism for allocating per-thread data. スレッドの詳細については、次を参照してください。マルチ スレッドします。For a complete discussion of threads, see Multithreading.

スレッド ローカル変数の宣言を使用する必要があります拡張属性構文_ _declspecキーワード、スレッドキーワード。Declarations of thread local variables must use extended attribute syntax and the __declspec keyword with the thread keyword. たとえば、次に示すコードは、整数型のスレッド ローカル変数を宣言して特定の値に初期化します。For example, the following code declares an integer thread local variable and initializes it with a value:

__declspec( thread ) int tls_i = 1;

スレッド ローカル変数を動的に読み込まれるライブラリで使用する場合は、スレッド ローカル変数を正しく初期化されませんを引き起こす可能性のある要因を意識する必要があります。When using thread-local variables in dynamically-loaded libraries, you need to be aware of factors that can cause a thread-local variable to not be initialized correctly:

  1. (コンス トラクターを含む) が関数呼び出しで、変数が初期化されると、バイナリまたは DLL が読み込まれた後に開始されたスレッドのスレッド、プロセスに読み込むバイナリまたは DLL の原因となったに、この関数が呼び出すのみ。If the variable is initialized with a function call (including constructors), this function will only be called for the thread that caused the binary/DLL to load into the process, and for those threads that started after the binary/DLL was loaded. DLL が読み込まれるときに既に実行されているその他のスレッドの初期化関数は呼び出されません。The initialization functions are not called for any other thread that was already running when the DLL was loaded. 動的な初期化は、決して、スレッドの開始時に、DLL がプロセスに含まれていない場合にメッセージを取得の DLL_THREAD_ATTACH、DllMain 呼び出しが、DLL で発生します。Dynamic initialization occurs on the DllMain call for DLL_THREAD_ATTACH, but the DLL never gets that message if the DLL isn't in the process when the thread starts.

  2. 定数値を持つ静的に初期化されるスレッド ローカル変数は、すべてのスレッドでは正しく初期化一般にされます。Thread-local variables that are initialized statically with constant values are generally initialized properly on all threads. ただし、2017 年 12 月の時点では、既知の準拠の問題では、Microsoft C++ constexpr 変数が静的な初期化ではなく動的設けてコンパイラ。However, as of December 2017 there is a known conformance issue in the Microsoft C++ compiler whereby constexpr variables receive dynamic rather than static initialization.

    メモ:将来のコンパイラの更新プログラムで修正するのには、これらの問題の両方が必要です。Note: Both of these issues are expected to be fixed in future updates of the compiler.

さらに、スレッド ローカル オブジェクトと変数を宣言するときに、次のガイドラインを確認する必要があります。Additionally, you must observe these guidelines when declaring thread local objects and variables:

  • 適用することができます、スレッド属性のみをクラスとデータの宣言と定義されます。スレッド関数宣言または定義では使用できません。You can apply the thread attribute only to class and data declarations and definitions; thread cannot be used on function declarations or definitions.

  • 指定することができます、スレッド静的ストレージ存続期間のデータ項目にのみ属性。You can specify the thread attribute only on data items with static storage duration. これには、グローバルなデータ オブジェクトが含まれます (どちらも静的extern)、ローカルな静的オブジェクト、およびクラスの静的データ メンバー。This includes global data objects (both static and extern), local static objects, and static data members of classes. 使用して自動データ オブジェクトを宣言することはできません、スレッド属性。You cannot declare automatic data objects with the thread attribute.

  • 使用する必要があります、スレッド宣言と、スレッド ローカル オブジェクトの定義の属性宣言と定義が同じファイルまたは別のファイルで発生するかどうか。You must use the thread attribute for the declaration and the definition of a thread local object, whether the declaration and definition occur in the same file or separate files.

  • 使用することはできません、スレッド型修飾子として属性。You cannot use the thread attribute as a type modifier.

  • オブジェクトの宣言を使用するため、スレッド属性は許可されて、これら 2 つの例は意味的に同等です。Because the declaration of objects that use the thread attribute is permitted, these two examples are semantically equivalent:

    // 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 では、自分自身への参照を含む式でオブジェクトや変数を初期化できます。ただし、この場合のオブジェクトは、非静的なものに限られます。Standard C permits initialization of an object or variable with an expression involving a reference to itself, but only for objects of nonstatic extent. C++ では、通常、自分自身への参照を含む式でこのようにオブジェクトを動的に初期化できますが、この種の初期化はスレッド ローカル オブジェクトでは許可されません。Although C++ normally permits such dynamic initialization of an object with an expression involving a reference to itself, this type of initialization is not permitted with thread local objects. 例えば:For example:

    // 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++ では許可します。Note that a sizeof expression that includes the object being initialized does not constitute a reference to itself and is allowed in C and C++.

Microsoft 固有の仕様はここまでEND Microsoft Specific

関連項目See also

__declspec__declspec
キーワードKeywords
スレッド ローカル ストレージ (TLS: Thread Local Storage)Thread Local Storage (TLS)