スレッド ローカル ストレージおよびスレッドごとの相対静的フィールド

1 つのスレッドとアプリケーション ドメインに固有のデータを格納するには、マネージ スレッド ローカル ストレージ (TLS: Thread Local Storage)、およびスレッドごとの相対静的フィールドを使用します。コンパイル時に要件を正確に予測できる場合は、スレッド相対静的フィールドを使用します。実行時にならないと実際の要件がわからない場合は、マネージ スレッド ローカル ストレージを使用します。

アンマネージ C++ では、TlsAlloc を使用してスロットを動的に割り当て、__declspec(thread) で変数をスレッドごとに割り当てることを宣言します。スレッド ローカル ストレージ、およびスレッド相対静的フィールドには、この動作のマネージ バージョンが用意されています。

スレッド ローカル ストレージ

マネージ スレッド ローカル ストレージには、1 つのスレッドとアプリケーション ドメインの組み合わせに対して、一意の動的なデータ スロットが用意されています。このデータ スロットには 2 つのタイプがあります。名前付きスロットと名前のないスロットです。名前付きスロットは、ニーモニック ID を使用できるという利点があります。ただし、他のコンポーネントがそのスレッド相対ストレージに対して同じ名前を使用しており、1 つのスレッドが、あるコンポーネントとその他のコンポーネントからコードを実行する場合、この 2 つのコンポーネントが互いのデータを破損してしまう可能性があります。これは、名前のないデータ スロットを使用して回避できます。

Noteメモ :

名前付きスロットと名前のないスロットは、どちらもスレッド固有のものです。同じ名前付きスロットを使用していたとしても、あるスレッドが、他のスレッドからのデータを変更することはできません。同じスレッドが、同じ名前付きデータ スロットを使用した 2 つの異なるコードを実行した場合にだけ、競合が発生します。

マネージ TLS を使用するには、Thread.AllocateNamedDataSlot または Thread.AllocateDataSlot を使用してデータ スロットを作成し、適切なメソッドでこのスロットに含まれる情報を設定または取得します。

スレッド相対静的フィールド

使用するフィールドの型が常に 1 つのスレッドとアプリケーション ドメインの組み合わせに一意である必要がある場合は、ThreadStaticAttribute で静的フィールドを宣言します。すべてのクラス コンストラクタ コードはそのフィールドにアクセスする最初のコンテキストの最初のスレッドで実行されるので注意が必要です。その他のスレッドまたはコンテキストについては、これらのフィールドが参照型の場合は null (Visual Basic では Nothing ) に、値型の場合は既定値に初期化されます。したがって、クラス コンストラクタを使用してスレッド相対静的フィールドを初期化しないでください。代わりに、スレッド相対静的フィールドは常に null (Nothing) または既定値に初期化されると仮定できます。

参照

関連項目

ContextStaticAttribute
Thread.GetNamedDataSlot
ThreadStaticAttribute
CallContext

その他の技術情報

マネージ スレッド処理