Как работает pthread_key_t и метод pthread_key_create?

У меня возникли проблемы с выяснением того, как работают pthread_key_t и pthread_key_create. Насколько я понимаю, каждый поток имеет TLS (локальное хранилище потока), и этот ключ используется для доступа к локальному хранилищу потока. Что я не получаю, так это когда ключ создается, каждый ли поток его использует? Допустим, поток 0 создает ключ 0, может ли поток 1 использовать ключ 0? Если бы поток 1 использовал ключ 0, получал бы он доступ к своему собственному TLS или к TLS потока 0?

Есть ли какой-нибудь глобальный массив или что-то, что отслеживает все используемые ключи?

1 ответ

pthread_keys - это как раз то, что вы сказали, локальное хранилище потоков, на которое ссылается общий ключ. Таким образом, несколько потоков используют один и тот же ключ, но получают разное пространство для хранения (для каждого потока).

Быстрый пример (тоже придуманный), скажем, вы строили асинхронный сервер (например, IMAP). Вы можете отслеживать клиентские соединения в массиве, каждый из которых имеет ключ для текущей задачи / запроса. Поэтому, когда приходит запрос, новый поток запускается, и поток сохраняет в ключе Client_Connection->WhatAmIDoing указатель на структуру запроса. Теперь потоку не нужно будет передавать этот указатель, потому что любая выполняемая этим потоком функция может просто вызвать функцию pthread_getspecific() и получить указатель на то, что он должен делать.

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