Windows: Кто вызывает TlsAlloc ДО загрузки моего приложения?
У меня есть приложение, которое использует большое количество (не спрашивайте!) Переменных локального хранилища потоков. Это работало без проблем в течение почти десятилетия... до недавнего сюрприза.
У клиента есть ноутбук под управлением Windows7 (64-разрядная версия)... и в его системе происходит сбой выделения TLS. (Моя проблема не совсем в этом, но достаточно близко). Он утверждает, что его система довольно стандартна; у него есть ZoneAlarm, но он утверждает, что все остальное - запас; возьми это с крошкой соли). Как я узнаю, кто или что выделяет другие слоты TLS (и эффективно выводит меня из слотов)?
Приложение является консольным автономным приложением и довольно ванильно: открывать / читать / записывать файлы, немного многопоточности, практически ничего, поэтому я ожидаю, что будут активно задействованы только базовые DLL-библиотеки Windows. Я знаю, что некоторые библиотеки DLL (даже Windows) могут обслуживать основанные на потоках действия и поэтому будут выделять свои собственные слоты TLS, и это нормально. Но я не ожидаю, что лоты и лоты выделяются чем-то вменяемым. Есть ли что-то еще, что может вставить себя в мое пространство процесса как часть запуска моего приложения (может быть, брандмауэр)?
Сколько слотов TLS должно быть выделено в типичном процессе при запуске? Откуда исходит спрос? Могу ли я отследить вызовы TLS, чтобы узнать, кто их как-то распределяет?
РЕДАКТИРОВАТЬ: 1 января 2013 г.: Имея некоторый опыт сейчас, и когда мой инструмент сообщает о требовании TLS при запуске, я вижу что-то вроде следующего:
- Win XP 64 8 ядер 16 Гб ОЗУ: 3 переменные TLS заняты
- Windows Vista 32 ОЗУ 4 ГБ: 4 переменные TLS заняты
- Win 7 Pro: 4 ядра, 8 Гб оперативной памяти: 7 переменных TLS заняты
- Win 7 (французская версия): 2 ядра, 4 ГБ: минимум 25 переменных TLS заняты, больше в некоторых конфигурациях
Мы проверяем Windows 8, но его спрос на TLS кажется выше. Но что на самом деле объясняет огромную разницу между двумя системами Windows 7? Есть ли какая-то необходимость в переменных TLS (предположительно, в DLL для хранения состояния потока) до запуска моего приложения, особенно если учесть, что в более ранней версии Windows не было необходимости?
Если это поможет, мы запускаем 32-битное приложение.