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


Я читал Kerrisk The Linux Programming Interface: A Linux and UNIX System Programming Handbook, Глава 31 о потоках. Эта глава включает данные, относящиеся к конкретным потокам (раздел 31.3.4), и локальное хранилище потоков (раздел 31.4). Темы были рассмотрены на страницах 663-669.

Конкретные данные потока (pthread_key_create, pthread_setspecific, pthread_getspecific, и друзья) выглядит более мощным, но, кажется, немного более громоздким в использовании, и, кажется, использует менеджер памяти чаще.

Поток Локальное хранилище (__thread в статических и глобальных объявлениях) выглядит немного менее мощным, так как оно ограничено временем компиляции, но его, по-видимому, проще использовать и, похоже, не входит в диспетчер памяти во время выполнения.

Я могу ошибаться относительно диспетчера памяти времени выполнения, поскольку за кулисами может быть код, который вызывает pthread_key_create, когда он сталкивается с переменными __thread.

Керриск не предложил сравнить / противопоставить две стратегии, и он не дал рекомендации о том, когда следует используйте который в данной ситуации.

Чтобы добавить контекст к вопросу: я оцениваю стороннюю библиотеку. Библиотека использует глобалы, не использует блокировку , и я хочу использовать ее в многопоточной программе. Программа использует потоковую обработку для минимизации сетевых задержек.

Есть ли победитель раздачи? Или существуют различные сценарии, которые оправдывают использование одного или другого?

2 12

2 ответа:

pthread_key_create и друзья намного старше, и поэтому поддерживаются на большем количестве систем.

__thread является относительным новичком, обычногораздо удобнее использовать, и (Согласно Википедии) поддерживается на большинстве систем POSIX, которые все еще имеют значение: Solaris Studio C/C++, IBM XL C/C++, GNU C, Clang и компилятор Intel C++ (системы Linux).

__thread также имеет существенное преимущество, что он может использоваться из обработчиков сигналов (за исключением использования __thread из dlopened shared library, смотрите эту ошибку ), потому что ее использование не включает malloc (с тем же исключением).

Интерфейсы pthread являются стандартными для POSIX, поэтому они более портативны. Используйте их, если вы собираетесь использовать код на чем-то, кроме системы linux. С другой стороны, если вы находитесь строго на gcc/linux, то механизм __thread, безусловно, проще в использовании. Просто имейте в виду, что это специфическое расширение gcc, и не поддерживается на всех платформах.