6.62 Локальное хранилище потоков
Локальное хранилище потоков (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 для подробного объяснения четырёх моделей адресации локального хранилища потоков и того, как ожидается, что будет работать модель выполнения.
| • Редактирование C99 для локального хранилища потоков: | ||
| • Редактирование C++98 для локального хранилища потоков: |
Далее: Двоичные константы, Предыдущее: Неименованные поля, Наверх: Расширения C [Содержание][Индекс]
© Free Software Foundation
Licensed under the GNU Free Documentation License, Version 1.3.
https://gcc.gnu.org/onlinedocs/gcc-5.5.0/gcc/Thread-Local.html