Эти переменные расположены в стеке, и каждый поток имеет свой собственный стек: эти переменные являются частными для каждого потока (они не являются общими). (Подробнее см. этот ответ .)
Если вы, например, назначите thread_data глобальному указателю, другие потоки смогут получить доступ к thread_data через глобальный указатель.
Данные, специфичные для потока (например, pthread_setspecific), используются для создания переменных, которые являются глобальными, но все же специфичными для каждого потока (не разделяемого): это глобальные переменные, специфичные для потока.
Вам нужно использовать переменные, специфичные для потока, когда вы хотите использовать глобальные переменные, но не хотите делить их между потоками.