dwTlsIndex
сам по себе не хранится ни в одной локальной памяти потока, поэтому он не помечен как thread_local
или __declspec(thread)
.
Цель этих ключевых слов - объявить отдельная копия данной переменной в каждом запущенном потоке. dwTlsIndex
не предназначено для такого копирования. Это глобальная переменная, инициализируемая 1 раз при запуске программы через TlsAlloc()
, а затем совместно используемая всеми работающими потоками. Таким образом, не может сам храниться в локальной памяти потока.
Каждый поток имеет свой собственный локальный массив слотов локальной памяти потока. dwTlsIndex
указывает индекс данного слота (переменной) в этих массивах. Индекс данной переменной, хранящейся в локальной памяти потока, одинаков для всех потоков. Благодаря глобальному совместному использованию dwTlsIndex
все потоки знают, какой слот для доступа к этой переменной.
Прочтите документацию Microsoft для получения дополнительной информации о том, как Thread Local Storage действительно работает. Вы сосредотачиваетесь на конкретном примере кода и не обращаете внимания на общую картину.