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