0

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

既然 boost 是这个概念的一个可移植的例子,那么这种机制具体是如何工作的呢?

4

1 回答 1

0

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


Ignore If you Want——它只是通过源代码找到感兴趣的功能的跟踪

问题的症结始于[boost]/boost/thread/tss.hpp函数getthread_specific_ptr函数reset——即分别获取和销毁所引用的对象。注意:数据对象没有放在thread_specific_ptr's 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调用TlsAlloc()win32(链接)和pthread_key_createpthread(链接)。这些调用确保在 ptr 初始化时,ptr 接收到一个唯一标识符,该标识符可用于以 API 特定的方式检索对象的数据。特定线程 API 使用 thread-id(特定于上下文并由库本身解析)和对象标识符来返回特定于某个线程上下文的对象。

于 2010-04-13T10:06:44.930 回答