Локальное хранилище Thread, является ли ключевое слово thread_local обязательным? - PullRequest
1 голос
/ 12 марта 2020

Я пытаюсь понять эту концепцию.

Обязательно ли ключевое слово thread_local или __declspec(thread)?

В Использование локального хранилища потоков в MSDN, почему переменная dwTlsIndex не декорирована thread_local или __declspec(thread)?

1 Ответ

1 голос
/ 12 марта 2020

dwTlsIndex сам по себе не хранится ни в одной локальной памяти потока, поэтому он не помечен как thread_local или __declspec(thread).

Цель этих ключевых слов - объявить отдельная копия данной переменной в каждом запущенном потоке. dwTlsIndex не предназначено для такого копирования. Это глобальная переменная, инициализируемая 1 раз при запуске программы через TlsAlloc(), а затем совместно используемая всеми работающими потоками. Таким образом, не может сам храниться в локальной памяти потока.

Каждый поток имеет свой собственный локальный массив слотов локальной памяти потока. dwTlsIndex указывает индекс данного слота (переменной) в этих массивах. Индекс данной переменной, хранящейся в локальной памяти потока, одинаков для всех потоков. Благодаря глобальному совместному использованию dwTlsIndex все потоки знают, какой слот для доступа к этой переменной.

Прочтите документацию Microsoft для получения дополнительной информации о том, как Thread Local Storage действительно работает. Вы сосредотачиваетесь на конкретном примере кода и не обращаете внимания на общую картину.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...