Локальное хранилище потоков
Все потоки процесса совместно используют свое виртуальное адресное пространство. Локальные переменные функции уникальны для каждого потока, выполняющего функцию. Однако статические и глобальные переменные разделяются всеми потоками в процессе. С помощью локального хранилища потока (TLS) можно предоставить уникальные данные для каждого потока, к которому процесс может получить доступ с помощью глобального индекса. Один поток выделяет индекс, который можно использовать другими потоками для получения уникальных данных, связанных с индексом.
Константная TLS_MINIMUM_AVAILABLE определяет минимальное количество индексов TLS, доступных в каждом процессе. Это минимальное значение гарантированно составляет не менее 64 для всех систем. Максимальное число индексов для каждого процесса составляет 1088.
При создании потоков система выделяет массив значений LPVOID для TLS, которые инициализируются в NULL. Прежде чем использовать индекс, его необходимо выделить одним из потоков. Каждый поток хранит свои данные для индекса TLS в слоте TLS в массиве. Если данные, связанные с индексом, будут соответствовать значению LPVOID, можно хранить данные непосредственно в слоте TLS. Однако если вы используете большое количество индексов таким образом, лучше выделить отдельное хранилище, объединить данные и свести к минимуму количество используемых слотов TLS.
На следующей схеме показано, как работает TLS. Пример кода, демонстрирующий использование локального хранилища потока, см. в разделе Использование локального хранилища потоков.
Процесс состоит из двух потоков, thread 1 и Thread 2. Он выделяет два индекса для использования с TLS, gdwTlsIndex1 и gdwTlsIndex2. Каждый поток выделяет два блока памяти (по одному для каждого индекса), в котором хранятся данные, и сохраняет указатели на эти блоки памяти в соответствующих слотах TLS. Чтобы получить доступ к данным, связанным с индексом, поток извлекает указатель на блок памяти из слота TLS и сохраняет его в локальной переменной lpvData.
Это идеально подходит для использования TLS в библиотеке динамических ссылок (DLL). Пример см. в разделе Использование локального хранилища потоков вбиблиотеки динамических ссылок.
Связанные разделы