6.6 Потоковое локальное хранилище
Потоковое локальное хранилище (TLS) — это механизм, с помощью которого переменные размещаются так, что для каждого существующего потока создаётся отдельный экземпляр переменной. Модель времени выполнения, используемая GCC для реализации этого механизма, изначально была разработана в ABI, специфичном для процессора IA-64, но впоследствии была перенесена и на другие процессоры. Для её работы требуется значительная поддержка со стороны компоновщика (ld), динамического компоновщика (ld.so) и системных библиотек (libc.so и libpthread.so), поэтому она доступна не везде.
На пользовательском уровне это расширение реализовано в виде нового ключевого слова класса хранения: __thread. Например:
__thread int i; extern __thread struct state s; static __thread char *p;
Спецификатор __thread можно использовать самостоятельно, со спецификаторами extern или static, но ни с какими другими спецификаторами класса хранения. При использовании с extern или static спецификатор __thread должен располагаться сразу после другого спецификатора класса хранения.
Спецификатор __thread можно применять к любой глобальной переменной, статической переменной уровня файла, статической переменной уровня функции или статическому члену-данным класса. Его нельзя применять к автоматической переменной блочной области видимости или нестатическому члену-данным.
При применении оператора взятия адреса к потоковой локальной переменной он вычисляется во время выполнения и возвращает адрес экземпляра этой переменной для текущего потока. Полученный таким образом адрес может использоваться любым потоком. При завершении потока все указатели на потоковые локальные переменные этого потока становятся недействительными.
Статическая инициализация не может ссылаться на адрес потоковой локальной переменной.
В C++ при наличии инициализатора потоковой локальной переменной он должен быть константным выражением в соответствии с разделом 5.19.2 стандарта ANSI/ISO C++.
Подробное объяснение четырёх моделей адресации потокового локального хранилища и принципов работы среды выполнения см. в документе Обработка потокового локального хранилища в ELF.
© Free Software Foundation
Licensed under the GNU Free Documentation License, Version 1.3.
https://gcc.gnu.org/onlinedocs/gcc-15.3.0/gcc/Thread_002dLocal.html