Спецификатор класса хранения _Thread_local в C?

Я прочитал примечание в книге C How to Program 7th о каком-то новом стандартном классе хранения C с именем _Thread_local:

Новый стандарт C добавляет спецификатор класса памяти _Thread_local, который выходит за рамки этой книги.

Я искал его в Google и здесь, но ничего не появилось. Может ли кто-нибудь дать мне ссылку об этом?


person Community    schedule 12.01.2013    source источник
comment
_Thread_local был добавлен в C11, а новый стандартный заголовок, содержащий его, — <threads.h>. Вы можете посмотреть стандарт для информации. У GCC его еще нет. Вам нужно будет найти компилятор, который реализует эту функцию C11.   -  person P.P    schedule 12.01.2013
comment
@KingsIndian, многие компиляторы, включая gcc, уже реализуют эту функцию, но еще не ключевое слово. gcc имеет его как __thread, а другие компиляторы могут иметь его как __declspec(thread). Обычно достаточно простого #define из _Thread_local.   -  person Jens Gustedt    schedule 12.01.2013
comment
GCC 6 и 7 поддерживают C11, за исключением того, что они не поддерживают <threads.h> . GCC 9 определенно поддерживает это, но я не знаю о GCC 8.   -  person Swiss Frank    schedule 17.05.2020


Ответы (1)


Переменным, отмеченным _Thread_local, присваивается продолжительность хранения «потока», то есть они выделяются, когда поток начинается, и освобождаются, когда поток заканчивается. Такие переменные являются «локальными» для потока, поскольку каждый поток имеет свою собственную копию переменной. Это отличается от продолжительности статического хранения (один экземпляр переменной для всей программы). См. http://en.cppreference.com/w/c/language/storage_class_specifiers для более подробной информации.

person nneonneo    schedule 12.01.2013
comment
Является ли статическое ключевое слово избыточным при использовании _Thread_local? - person Edward Falk; 12.11.2018
comment
извините, это может быть очень старо для повторного открытия, но зачем нам такая переменная, почему мы не можем просто объявить переменную внутри функции, а не объявлять ее в глобальном пространстве и сказать, что она локальна для потока - person csavvy; 14.03.2020
comment
@EdwardFalk static для глобальной переменной делает переменную видимой только в этой единице компиляции; static для локальной переменной делает ее статически выделенной, но видимой только для содержащей ее области. @sravs, что, если вам нужна глобальная переменная, которая имеет разные значения в каждом потоке? Вот для чего этот модификатор. - person nneonneo; 14.03.2020