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

プロセスのすべてのスレッドで、仮想アドレス空間が共有されます。 関数のローカル変数は、関数を実行する各スレッドに固有です。 ただし、静的変数とグローバル変数は、プロセス内のすべてのスレッドによって共有されます。 スレッド ローカル ストレージ (TLS) では、プロセスがグローバル インデックスを使用してアクセスできるスレッドごとに一意のデータを提供できます。 1 つのスレッドがインデックスを割り当てます。このインデックスは、他のスレッドがインデックスに関連付けられている一意のデータを取得するために使用できます。

定数TLS_MINIMUM_AVAILABLEは、各プロセスで使用できる TLS インデックスの最小数を定義します。 この最小値は、すべてのシステムで 64 以上であることが保証されます。 プロセスあたりのインデックスの最大数は 1,088 です。

スレッドが作成されると、システムは TLS に LPVOID 値の配列を割り当てます。これは NULL に初期化されます。 インデックスを使用するには、そのインデックスをいずれかのスレッドで割り当てる必要があります。 各スレッドは、TLS インデックスのデータを配列内の TLS スロット に格納します。 インデックスに関連付けられているデータが LPVOID 値に収まる場合は、TLS スロットに直接データを格納できます。 ただし、このように多数のインデックスを使用している場合は、個別のストレージを割り当て、データを統合し、使用中の TLS スロットの数を最小限に抑えることをお勧めします。

次の図は、TLS のしくみを示しています。 スレッド ローカル ストレージの使用を示すコード例については、「スレッド ローカル Storageの使用」を参照してください。

Diagram that shows how the T L S process works.

このプロセスには、スレッド 1 とスレッド 2 の 2 つのスレッドがあります。 TLS、gdwTlsIndex1、gdwTlsIndex2 で使用する 2 つのインデックスが割り当てられます。 各スレッドは、データを格納する 2 つのメモリ ブロック (インデックスごとに 1 つ) を割り当て、対応する TLS スロットにこれらのメモリ ブロックへのポインターを格納します。 インデックスに関連付けられているデータにアクセスするために、スレッドは TLS スロットからメモリ ブロックへのポインターを取得し、lpvData ローカル変数に格納します。

ダイナミック リンク ライブラリ (DLL) で TLS を使用するのが理想的です。 例については、「ダイナミック リンク ライブラリでのスレッド ローカル Storageの使用」を参照してください

スレッド ローカル Storage (Visual C++)

スレッド ローカル ストレージの使用

ダイナミック リンク ライブラリでのスレッド ローカル Storageの使用