Чтобы ответить на ваши конкретные вопросы:
- Нет, это не часть C99. Вы не найдете его нигде в n1256.pdf (C99 + TC1 / 2/3) или в оригинальном стандарте C99.
- Да,
__thread
переменные начинаются с их инициализированного значения в каждом новом потоке.
- С точки зрения поведения программы переменные класса локального хранилища ведут себя почти так же, как обычные глобальные переменные в не многопоточных программах. Тем не менее, они влекут за собой немного больше затрат времени выполнения (память и время запуска), и могут быть проблемы с ограничениями размера и количества локальных переменных потока. Все это довольно сложно и варьируется в зависимости от того, связана ли ваша программа со статической или динамической связью и находятся ли переменные в основной программе или в общей библиотеке ...
За пределами реализации C / POSIX (например, errno
и т. Д.), Класс локального хранилища потока, на мой взгляд, на самом деле не очень полезен. Это в значительной степени опора для того, чтобы избегать чистого обхода необходимого состояния в форме указателя контекста или чего-то подобного. Вы можете подумать, что это может быть полезно для обхода поврежденных интерфейсов, таких как qsort
, которые не принимают указатель контекста, но, к сожалению, нет гарантии, что qsort
вызовет функцию сравнения в том же потоке, который вызвал qsort
. Это может сломать работу и запустить ее в несколько потоков. То же самое относится и к большинству других интерфейсов, где возможен такой способ обхода.