На самом деле, данные, относящиеся к потокам, предназначены для случаев, когда вы НЕ хотите обмениваться данными между потоками - с данными, специфичными для потоков, каждый поток может использовать одно и то же имя переменной, но эта переменная ссылается на отдельное хранилище.
С помощью gcc вы можете объявить переменную как специфичную для потока, используя атрибут "__thread". Если вы только пытаетесь создать примитивный тип, специфичный для потока, и имеете дело только с Linux и GCC, то это возможное решение. Если вы действительно хотите быть переносимым между различными единицами (желаемая цель), или если вы хотите сделать сложные типы данных ориентированными на потоки, то для этого вам нужно использовать подпрограммы UNIX ...
В UNIX он работает так, что вы используете phread_key_create перед тем, как создавать потоки, чтобы создать уникальное имя переменной. Затем вы используете phread_setspecific и pthread_getspecific для изменения / доступа к данным, связанным с ключом. Семантика определенных функций set / get заключается в том, что ключ ведет себя как индекс в карте, где каждый поток имеет свою собственную карту, поэтому выполнение этих подпрограмм из разных потоков приводит к доступу / изменению разных данных. Если вы можете использовать карту, вы можете использовать хранилище для конкретных потоков.
Очевидно, что когда вы закончите, вам нужно вызвать соответствующие подпрограммы для очистки данных. Вы можете использовать pthread_cleanup_push , чтобы запланировать процедуру очистки для освобождения любых структур данных, связанных с ключом потока, и вы можете использовать pthread_key_destroy , когда ключ больше не используется.