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