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

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

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

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

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

T L S プロセスのしくみを示す図。

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

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

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

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

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