Специфичные данные по потоку против локального хранилища потоков

Я читал 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 и не поддерживается на всех платформах.