6.64 Локальное хранилище потоков
Локальное хранилище потоков (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-9.5.0/gcc/Thread-Local.html