Как работает pthread_key_t и метод pthread_key_create? - PullRequest
7 голосов
/ 25 января 2012

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

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

1 Ответ

5 голосов
/ 25 января 2012

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

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

...