Каким образом схема именования переносимого механизма хранения для конкретного потока генерирует относительные уникальные идентификаторы потока? - PullRequest
0 голосов
/ 13 апреля 2010

A переносное хранилище, специфичное для потока ссылка / идентификатор Механизм, экземпляром которого является boost / thread / tss.hpp, нуждается в способе генерирования уникальных ключей для себя. Этот ключ является уникальным в области видимости потока и впоследствии используется для извлечения объекта, на который он ссылается. Этот механизм используется в коде, написанном в независимом от потока формате.

Так как boost является переносимым примером этой концепции, как конкретно работает такой механизм?

1 Ответ

0 голосов
/ 13 апреля 2010

Повышающий поток переносим в библиотеку потоков 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 потоков использует идентификатор потока (специфичный для контекста и разрешаемый самой библиотекой) и идентификатор объекта для возврата объекта, специфичного для контекста определенного потока.

...