Книга: Системное программирование в среде Windows
Локальные области хранения потоков
Локальные области хранения потоков
Потокам могут требоваться собственные, независимо распределяемые и управляемые ими области памяти, защищенные от других потоков того же процесса. Одним из методов создания таких областей является вызов функции CreateThread (или _beginthreadex) с параметром lpvThreadParm, указывающим на структуру данных, уникальную для каждого потока. После этого поток может распределять память для дополнительных структур данных и получать доступ к ним через указатель lpvThreadParm. Эта методика используется в программе 7.1.
Кроме того, Windows предоставляет локальные области хранения потоков (Thread Local Storage, TLS), обеспечивающие каждый из потоков собственным массивом указателей. Организация TLS показана на рис. 7.3.
Индексы (строки) TLS первоначально не распределены, но в любой момент времени можно добавлять новые строки и освобождать существующие, причем минимально возможное число строк для любого процесса определяется значением TLS_MINIMUM_AVAILABLE (равным, по крайней мере, 64). Число столбцов может изменяться по мере создания новых потоков и завершения существующих.
Сначала мы рассмотрим управление индексами TLS. Логическим пространством для этого служит основной поток, но управлять индексами может любой поток.
Функция TlsAlloc возвращает распределенный индекс (> 0) или –1 (0xFFFFFFFF) в случае отсутствия доступных индексов.
DWORD TlsAlloc(VOID)
BOOL TlsFree(DWORD dwIndex)
Рис. 7.3. Локальные области хранения потоков в контексте процесса
Каждый отдельный поток может выбирать и устанавливать значения (указатели типа void), связанные с ее областью памяти, используя индексы TLS.
Программист всегда должен убеждаться в том, что параметр индекса TLS является действительным, то есть что он был распределен с помощью функции TlsAlloc, но не был освобожден.
LPVOID TlsGetValue(DWORD dwTlsIndex)
BOOL TlsSetValue(DWORD dwTlsIndex, LPVOID lpTlsValue)
TLS предоставляют удобный механизм организации памяти, являющейся глобальной в контексте потока, но недоступной другим потокам. Обычные глобальные хранилища разделяются всеми потоками. Несмотря на то что ни один поток не может получить доступа к TLS другого потока, любой поток может уничтожить индекс TLS другого потока, вызвав функцию TlsFree, так что этой функцией следует пользоваться с осторожностью. TLS часто используются DLL в качестве замены глобальной памяти библиотеки; в результате этого каждый поток получает в свое распоряжение собственную глобальную память. Кроме того, TLS обеспечивают вызывающим программам удобный способ взаимодействия с функциями DLL, и именно этот способ применения TLS является наиболее распространенным. В качестве примера в главе 12 (программа 12.4) TLS используются для создания библиотеки DLL с многопоточной поддержкой; другим важным элементом этого решения являются уведомления DLL о присоединении/отсоединении потоков и процессов путем вызова функции DllMain (глава 5).
- Обзор потоков
- Основные сведения о потоках
- Управление потоками
- Использование библиотеки С впотоках
- Пример: многопоточный поиск контекста
- Потоки и производительность
- Модель "хозяин/рабочий" и другие модели многопоточных приложений
- Пример: применение принципа "разделяй и властвуй" для решения задачи сортировки слиянием в SMP-системах
- Производительность
- Локальные области хранения потоков
- Приоритеты процессов и потоков и планирование выполнения
- Состояния потоков
- Возможные ловушки и распространенные ошибки
- Ожидание в течение конечного интервала времени
- Облегченные потоки
- Резюме
- Упражнения
- Достоинства и недостатки потоков
- Оптимальная структура хранения записей
- 2.12.2. Анализ усилительных каскадов в области малых времен
- 10.4. Локальные сети
- Наик Дайлип Системы хранения данных в Windows
- Глава 10 Возможности подсистемы хранения данных в различных версиях Windows NT
- 1.7 Иерархия драйверов систем хранения и типы драйверов
- 1.8 Ввод-вывод типичного приложения хранения данных
- 2.5 Логические единицы хранения (LUN)
- 6.6 Файловые системы для сетей хранения данных
- Настройка верхней области навигации
- Создание дочерней рабочей области