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

发布于 2024-08-28 20:09:12 字数 198 浏览 7 评论 0 原文

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

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

A portable thread specific storage reference/identity mechanism, of which boost/thread/tss.hpp is an instance, needs a way to generate a unique keys for itself. This key is unique in the scope of a thread, and is subsequently used to retrieve the object it references. This mechanism is used in code written in a thread neutral manner.

Since boost is a portable example of this concept, how specifically does such a mechanism work ?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

万水千山粽是情ミ 2024-09-04 20:09:13

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


如果你愿意就忽略——这只是通过源代码跟踪找到感兴趣的函数

问题的症结始于[boost]/boost/thread/tss.hpp 使用thread_specific_ptrget 函数和reset 函数——即分别获取和销毁所引用的对象。注意:数据对象没有放置在thread_specific_ptr的ctor的引用中,也没有被dtor销毁。获取和重置函数调用 set_tss_dataget_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 the get function of thread_specific_ptr and the reset function -- i.e., the aquisition and the destruction, respectively, of the object referenced. Note: the data object is not placed in the reference of thread_specific_ptr's ctor, or destroyed by the dtor. The get and reset function call set_tss_data and get_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. In get_current_thread_data there is a function call create_current_thread_tls_key and this is the function that will create a unique identifier for the thread_specific_ptr object.


create_current_thread_tls_key calls TlsAlloc() on win32 (link) and pthread_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.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文