スレッド ローカル ストレージ
プロセスのすべてのスレッドは、その仮想アドレス空間を共有します。 関数のローカル変数は、関数を実行する各スレッドに固有です。 ただし、静的変数とグローバル変数は、プロセス内のすべてのスレッドによって共有されます。 スレッド ローカル ストレージ (TLS) を使用すると、プロセスがグローバル インデックスを使用してアクセスできる各スレッドに一意のデータを提供できます。 1 つのスレッドがインデックスを割り当てます。これは、他のスレッドがインデックスに関連付けられている一意のデータを取得するために使用できます。
定数TLS_MINIMUM_AVAILABLEは、各プロセスで使用可能な TLS インデックスの最小数を定義します。 この最小値は、すべてのシステムで 64 以上であることが保証されます。 プロセスあたりのインデックスの最大数は 1,088 です。
スレッドが作成されると、システムは TLS LPVOID 値の配列を割り当てます。これは NULL に初期化されます。 インデックスを使用する前に、いずれかのスレッドによってインデックスを割り当てる必要があります。 各スレッドは、TLS インデックスのデータを配列内の TLS スロット に格納します。 インデックスに関連付けられているデータが LPVOID 値に収まる場合は、データを TLS スロットに直接格納できます。 ただし、このように多数のインデックスを使用している場合は、個別のストレージを割り当て、データを統合し、使用中の TLS スロットの数を最小限に抑える方が適切です。
次の図は、TLS のしくみを示しています。 スレッド ローカル ストレージの使用を示すコード例については、「スレッド ローカル ストレージ の使用」を参照してください。
このプロセスには、スレッド 1 とスレッド 2 の 2 つのスレッドがあります。 TLS で使用する 2 つのインデックス (gdwTlsIndex1 と gdwTlsIndex2) が割り当てられます。 各スレッドは、データを格納する 2 つのメモリ ブロック (インデックスごとに 1 つ) を割り当て、対応する TLS スロットにこれらのメモリ ブロックへのポインターを格納します。 インデックスに関連付けられているデータにアクセスするために、スレッドは TLS スロットからメモリ ブロックへのポインターを取得し、lpvData ローカル変数に格納します。
ダイナミック リンク ライブラリ (DLL) で TLS を使用するのが理想的です。 例については、「ダイナミック リンク ライブラリ でのスレッド ローカル ストレージの使用の」を参照してください。
関連トピック
-
スレッド ローカル ストレージ を使用した
-
ダイナミック リンク ライブラリ でのスレッド ローカル ストレージの使用の