Поделиться через


локальное хранилище потока

Все потоки процесса используют общий диапазон виртуальных адресов. Локальные переменные функции уникальны для каждого потока, выполняющего функцию. Однако статические и глобальные переменные совместно используются всеми потоками в процессе. С помощью локального хранилища потока (TLS) можно предоставить уникальные данные для каждого потока, к которому процесс может получить доступ с помощью глобального индекса. Один поток выделяет индекс, который может использоваться другими потоками для получения уникальных данных, связанных с индексом.

Константная TLS_MINIMUM_AVAILABLE определяет минимальное количество индексов TLS, доступных в каждом процессе. Это минимальное значение гарантированно равно 64 для всех систем. Максимальное число индексов на процесс составляет 1088.

При создании потоков система выделяет массив значений LPVOID для TLS, которые инициализируются значением NULL. Прежде чем индекс можно будет использовать, он должен быть выделен одним из потоков. Каждый поток хранит свои данные для индекса TLS в слоте TLS в массиве. Если данные, связанные с индексом, помещаются в значение LPVOID , данные можно хранить непосредственно в слоте TLS. Однако если таким образом используется большое количество индексов, лучше выделить отдельное хранилище, консолидировать данные и свести к минимуму количество используемых слотов TLS.

На следующей схеме показано, как работает ПРОТОКОЛ TLS. Пример кода, иллюстрирующих использование локального хранилища потока, см. в разделе Использование локального хранилища потока.

Схема, на которую показано, как работает процесс T L S.

Процесс содержит два потока: Поток 1 и Поток 2. Он выделяет два индекса для использования с TLS: gdwTlsIndex1 и gdwTlsIndex2. Каждый поток выделяет два блока памяти (по одному для каждого индекса), в которых хранятся данные, и сохраняет указатели на эти блоки памяти в соответствующих слотах TLS. Чтобы получить доступ к данным, связанным с индексом, поток извлекает указатель на блок памяти из слота TLS и сохраняет его в локальной переменной lpvData.

Идеально использовать TLS в библиотеке динамической компоновки (DLL). Пример см. в разделе Использование локального хранилища потока в библиотеке динамической компоновки.

Локальное хранилище потока (Visual C++)

Использование локального хранилища потоков

Использование локального хранилища потока в библиотеке динамической компоновки