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