Локальная память потока
Все потоки процесса совместно используют свое виртуальное адресное пространство. Локальные переменные функций потока являются уникальными для каждого потока, который запускает функцию. Однако статические и глобальные переменные совместно используются всеми потоками этого процесса. При помощи
локальной памяти потока (thread local storage, TLS), Вы можете обеспечивать уникальными данными каждый поток, который может быть допущен процессом к использованию глобального индекса. Используя TLS, один поток назначает индекс, который может быть использован другим потоком, чтобы получить уникальные данные, связанные с этим индексом.Константа
TLS_MINIMUM_AVAILABLE определяет минимальное число индексов локальной памяти потока (TLS), доступных в каждом процессе. Этот минимум гарантируется тем, что для всех системам их будет, по меньшей мере, 64. Ограничения для систем следующие:
Система |
Лимит |
Windows 2000 и позже |
1088 индексов на процесс |
Windows 98/Me |
80 индексов на процесс |
Windows 95 Windows NT 4.0 и ранее |
64 индексов на процесс |
Когда потоки создаются, система выделяет массив значений типа
LPVOID для локальной памяти потока (TLS), которые инициализируются значениями ПУСТО (NULL). Раньше индекса, который может быть использован, должен быть назначен один из потоков. Каждый поток сохраняет свои данные по индексу в массиве слотов TLS (TLS slot). Если данные, связанные с индексом соответствуют значению типа LPVOID, Вы можете сохранять данные непосредственно в слоте TLS. Однако если Вы используете большое количество индексов таким образом, лучше выделить отдельную память, объединяющую данные и минимизировать число слотов TLS в использовании.Нижеследующая диаграмма иллюстрирует, как работает локальная память потока (
TLS) .Процесс имеет два потока, Поток 1 и Поток 2. Назначается два индекса для использования с локальной памятью потока (TLS),
gdwTlsIndex1 и gdwTlsIndex2. Каждый поток выделяет два блока памяти (один для каждого индекса) в которых сохраняет данные и сохраняет указатели на эти блоки памяти в соответствующих слотах TLS. Чтобы получить доступ к данным, связанным с индексом, поток извлекает указатель на блок памяти из слота TLS и сохраняет его в локальной переменной lpvData.Идеально использовать локальную память потока (
TLS) в динамически подключаемой библиотеке (DLL). Чтобы реализовать локальную память потока (TLS) в DLL, используйте нижеследующие шаги:
static DWORD gdwTlsIndex;gdwTlsIndex= TlsAlloc(); LPVOIDlpvBuffer; lpvBuffer = (LPVOID) LocalAlloc(LPTR, 256); TlsSetValue(gdwTlsIndex, lpvBuffer); LPVOIDlpvData; lpvData = TlsGetValue(gdwTlsIndex); lpvBuffer= TlsGetValue(gdwTlsIndex); LocalFree((HLOCAL) lpvBuffer);
|
Пример, иллюстрирующий использование локальной памяти потока, см. в статьях Использование локальной памяти потока и Использование локальной памяти потока в динамически подключаемых библиотеках.