Использование __thread в c99 - PullRequest
4 голосов
/ 29 июля 2011

Я хотел бы определить несколько переменных как специфичных для потока, используя класс хранения __thread. Но три вопроса заставляют меня колебаться:

  1. Это действительно стандартно в c99? Или, более конкретно, насколько хороша поддержка компилятора?
  2. Будут ли переменные инициализированы в каждом потоке?
  3. Не многопоточные программы рассматривают их как обычные старые глобалы?

Ответы [ 2 ]

5 голосов
/ 29 июля 2011

Чтобы ответить на ваши конкретные вопросы:

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

За пределами реализации C / POSIX (например, errno и т. Д.), Класс локального хранилища потока, на мой взгляд, на самом деле не очень полезен. Это в значительной степени опора для того, чтобы избегать чистого обхода необходимого состояния в форме указателя контекста или чего-то подобного. Вы можете подумать, что это может быть полезно для обхода поврежденных интерфейсов, таких как qsort, которые не принимают указатель контекста, но, к сожалению, нет гарантии, что qsort вызовет функцию сравнения в том же потоке, который вызвал qsort. Это может сломать работу и запустить ее в несколько потоков. То же самое относится и к большинству других интерфейсов, где возможен такой способ обхода.

2 голосов
/ 29 июля 2011

Вы, вероятно, хотите прочитать это:

http://www.akkadia.org/drepper/tls.pdf

1) MSVC не поддерживает C99. GCC и другие компиляторы пытаются совместить GCC.

edit Подробная информация о поддержке компилятора для __thread доступна здесь:

http://chtekk.longitekk.com/index.php?/archives/2011/02/C8.html

2) Только C ++ поддерживает инициализатор, и он должен быть постоянным.

3) Не многопоточные приложения являются однопоточными.

...