Ответ 1
Прочитайте запись в Википедии.
Потоковое локальное хранилище не является чем-то особенным для С++. Иногда это происходит под разными именами, такими как "TLS" (просто аббревиатура от локального хранилища потоков) или "потоковое хранилище" (TSS).
Большинство операционных систем предоставляют API для доступа к хранилищу на потоках. Например, Windows имеет набор функций API, начиная с "TLS". Под капотом Win32 резервирует специальную область для множества данных на потоке, включая локальное хранилище пользовательских потоков, доступное через определенный регистр процессора (FS на x86). Linux предоставляет потоковое хранилище через API-интерфейсы pthread с именами типа pthread_key_create, и они обычно реализуются с использованием аналогичной техники.
Возможно, ОС не предоставляет никакой поддержки вообще. Однако, если ОС предоставляет уникальный идентификатор потока процесса через API, тогда библиотека времени выполнения С++ может поддерживать что-то концептуально, как std::map<thread_id, per_thread_storage>
внутренне. Конечно, тогда есть проблема того, что per_thread_storage
. Если программа была статически связана, она могла бы быть чем-то вроде указателя на большую структуру со всеми переменными хранилища нитей, объявленными в программе как элементы. Это упрощение, но вы получаете общую идею.
Доступ к переменным локального хранилища, очевидно, не просто чтение или запись в прямом режиме. Это потенциально довольно немного больше, чем это. Если вы собираетесь использовать многопоточное локальное/специфическое хранилище в определенной функции, я бы рекомендовал сначала скопировать указатель на локальную область потока в локальную переменную.