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