Повышающий поток переносим в библиотеку потоков pthread (для unix) и низкоуровневые API-интерфейсы Windows win32. Библиотека позволяет создать ссылку, уникальную в каждом потоке выполнения. Глобальный C API errno
представлен в качестве примера этой концепции в документации Boost.
Игнорировать, если вы хотите - это всего лишь трассировка в исходном коде для нахождения интересующей функции
Суть вопроса начинается в [boost]/boost/thread/tss.hpp
с функции get
, равной thread_specific_ptr
, и функции reset
, то есть с приобретения и уничтожения, соответственно, указанного объекта. Примечание: объект данных не помещается в ссылку ctor thread_specific_ptr
и не уничтожается dtor. Вызов и сброс функции вызывают set_tss_data
и get_tss_data
. Сосредоточив внимание только на аспекте настройки функциональности, вызов важной функции get_current_thread_data
косвенно обращается через файл cpp [boost]/libs/thread/src/[libname]/thread.cpp
через цепочку вызовов функций. В get_current_thread_data
есть вызов функции create_current_thread_tls_key
, и эта функция создаст уникальный идентификатор для объекта thread_specific_ptr
.
create_current_thread_tls_key
вызывает TlsAlloc()
на win32 ( ссылка ) и pthread_key_create
на pthread ( ссылка ). Эти вызовы гарантируют, что после инициализации ptr, ptr получает уникальный идентификатор, используемый специфичным для API способом для извлечения данных объекта. Специальный API потоков использует идентификатор потока (специфичный для контекста и разрешаемый самой библиотекой) и идентификатор объекта для возврата объекта, специфичного для контекста определенного потока.