可移植线程特定存储机制的命名方案如何生成线程相对唯一标识符?
一个可移植线程特定存储引用/身份机制(boost/thread/tss.hpp是一个实例)需要一种为其自身生成唯一密钥的方法。该键在线程范围内是唯一的,随后用于检索它引用的对象。该机制用于以线程中立方式编写的代码。
既然 boost 是这个概念的一个可移植的例子,那么这样的机制具体是如何工作的呢?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
Boost 线程可移植到 pthread 线程库(对于 unix)和 windows win32 低级 API。该库允许创建在每个执行线程中唯一的引用。全局 C API
errno
为 在 Boost 文档中作为此概念的示例。如果你愿意就忽略——这只是通过源代码跟踪找到感兴趣的函数
问题的症结始于
[boost]/boost/thread/tss.hpp
使用thread_specific_ptr
的get
函数和reset
函数——即分别获取和销毁所引用的对象。注意:数据对象没有放置在thread_specific_ptr
的ctor的引用中,也没有被dtor销毁。获取和重置函数调用set_tss_data
和get_tss_data
。仅关注功能的设置方面,重要的函数调用get_current_thread_data
通过 cpp 文件[boost]/libs/thread/src/[libname]/thread.cpp< /code> 通过一系列函数调用。在
get_current_thread_data
中有一个函数调用create_current_thread_tls_key
,该函数将为thread_specific_ptr
对象创建唯一标识符。create_current_thread_tls_key
在 win32 上调用TlsAlloc()
(链接)和 pthread 的pthread_key_create
(链接)。这些调用确保在 ptr 初始化时,ptr 会收到一个唯一标识符,该标识符可用于以特定于 API 的方式检索对象的数据。特定线程 API 使用线程 ID(特定于上下文并由库本身解析)和对象标识符来返回特定于某个线程上下文的对象。Boost thread is portable to the pthread threading library (for unix) and the windows win32 low-level-API's. The library allows a reference to be created which is unique in each thread of execution. The global C API
errno
is presented as an example of this concept in Boost's documentation.Ignore If you Want -- it's just a trace through the source code finding the function of interest
The crux of the matter begins in
[boost]/boost/thread/tss.hpp
with theget
function ofthread_specific_ptr
and thereset
function -- i.e., the aquisition and the destruction, respectively, of the object referenced. Note: the data object is not placed in the reference ofthread_specific_ptr
's ctor, or destroyed by the dtor. The get and reset function callset_tss_data
andget_tss_data
. Focusing just on the setting aspect of the functionality, the important function call,get_current_thread_data
, indirects via the cpp file[boost]/libs/thread/src/[libname]/thread.cpp
via a chain of function calls. Inget_current_thread_data
there is a function callcreate_current_thread_tls_key
and this is the function that will create a unique identifier for thethread_specific_ptr
object.create_current_thread_tls_key
callsTlsAlloc()
on win32 (link) andpthread_key_create
for pthread (link). These calls assure that upon initialization of the ptr, the ptr receives a unique identifier usable in an API-specific manner to retrieve the object's data. The specific threading API uses the thread-id (context specific and resolved by the library itself) and the object identifier to return the object specific to the context of a certain thread.