Специфичные данные по потоку против локального хранилища потоков
Я читал Kerrisk Интерфейс программирования Linux: руководство по системному программированию Linux и UNIX, глава 31 по темам. В главе рассматриваются данные по конкретным темам (раздел 31.3.4) и локальное хранилище потоков (раздел 31.4). Темы были освещены на страницах 663-669.
Данные по конкретным темам (pthread_key_create
, pthread_setspecific
, pthread_getspecific
и друзья) выглядят более мощными, но, по-видимому, они немного более громоздки в использовании и чаще используют диспетчер памяти.
Локальное хранилище потоков (__thread
в статических и глобальных объявлениях) выглядит немного менее мощным, поскольку оно ограничено временем компиляции, но его, по-видимому, проще в использовании и, по-видимому, не работает в диспетчере памяти во время выполнения.
Я мог ошибаться в диспетчере памяти во время работы, так как может быть код за кулисами, который вызывает pthread_key_create
, когда он встречает переменные __thread
.
Kerrisk не предлагал сравнение/контраст двух стратегий, и он не делал рекомендации о том, когда использовать, что в данной ситуации.
Чтобы добавить контекст к вопросу: я оцениваю стороннюю библиотеку. Библиотека использует глобальные переменные, не использует блокировку, и я хочу использовать ее в многопоточной программе. Программа использует потоки для минимизации задержек сети.
Есть ли победитель? Или существуют разные сценарии, которые гарантируют использование одного или другого?
Ответы
Ответ 1
pthread_key_create
и друзья намного старше и, таким образом, поддерживаются в других системах.
__thread
является относительным новичком, как правило, гораздо удобнее в использовании, и (согласно Википедии) поддерживается на большинстве систем POSIX, которые по-прежнему имеют значение: Solaris Studio C/C++, IBM XL C/C++, GNU C, Компилятор Clang и Intel C++ (системы Linux).
__thread
также имеет значительное преимущество, что пригодная для использования обработчиков сигналов (за исключением использования __thread
из dlopen
эд общей библиотеки увидеть эту ошибку), поскольку его использование не связанно с malloc
(с тем же исключением).
Ответ 2
Интерфейсы pthread являются стандартом POSIX, поэтому они более переносимы. Используйте их, если вы намерены использовать код для чего-то, кроме системы linux. С другой стороны, если вы строго разбираетесь в gcc/linux, то механизм __thread, безусловно, проще в использовании. Просто имейте в виду, что это специальное расширение gcc и не поддерживается на всех платформах.