可移植线程特定存储机制的命名方案如何生成线程相对唯一标识符?

时间:2010-04-13 09:29:19

标签: multithreading boost-thread systems-programming low-level-api thread-specific-storage

可移植线程特定存储引用/身份机制,其中boost / thread / tss.hpp是一个实例,需要一种为自己生成唯一键的方法。此键在线程范围内是唯一的,随后用于检索它引用的对象。此机制用于以线程中立方式编写的代码中。

由于boost是这个概念的一个可移植的例子,这种机制如何具体工作?

1 个答案:

答案 0 :(得分:0)

Boost线程可移植到pthread线程库(用于unix)和windows win32低级API。该库允许创建在每个执行线程中唯一的引用。在Boost的文档中,全局C API errno是此概念的presented as an example


忽略如果您想要 - 只是通过源代码查找感兴趣的功能

问题的症结始于[boost]/boost/thread/tss.hppget函数thread_specific_ptrreset函数 - 分别是获取和破坏引用的对象。注意:数据对象不会放在thread_specific_ptr的ctor的引用中,也不会被dtor销毁。 get和reset函数调用set_tss_dataget_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(特定于上下文并由库本身解析)和对象标识符来返回特定于某个线程的上下文的对象。