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

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

Другие вопросы по тегам