可移植线程特定存储引用/身份机制,其中boost / thread / tss.hpp是一个实例,需要一种为自己生成唯一键的方法。此键在线程范围内是唯一的,随后用于检索它引用的对象。此机制用于以线程中立方式编写的代码中。
由于boost是这个概念的一个可移植的例子,这种机制如何具体工作?
答案 0 :(得分:0)
Boost线程可移植到pthread线程库(用于unix)和windows win32低级API。该库允许创建在每个执行线程中唯一的引用。在Boost的文档中,全局C API errno
是此概念的presented as an example。
忽略如果您想要 - 只是通过源代码查找感兴趣的功能
问题的症结始于[boost]/boost/thread/tss.hpp
,get
函数thread_specific_ptr
和reset
函数 - 分别是获取和破坏引用的对象。注意:数据对象不会放在thread_specific_ptr
的ctor的引用中,也不会被dtor销毁。 get和reset函数调用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
在win32(link)上调用TlsAlloc()
,在pthread(link)调用pthread_key_create
。这些调用确保在初始化ptr时,ptr接收以API特定方式可用的唯一标识符以检索对象的数据。特定的线程API使用thread-id(特定于上下文并由库本身解析)和对象标识符来返回特定于某个线程的上下文的对象。