Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Multithreading 可移植线程特定存储机制的命名方案如何生成线程相关的唯一标识符?_Multithreading_Boost Thread_Systems Programming_Low Level Api_Thread Specific Storage - Fatal编程技术网

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

Multithreading 可移植线程特定存储机制的命名方案如何生成线程相关的唯一标识符?,multithreading,boost-thread,systems-programming,low-level-api,thread-specific-storage,Multithreading,Boost Thread,Systems Programming,Low Level Api,Thread Specific Storage,可移植的特定于线程的存储引用/标识机制(boost/thread/tss.hpp就是其中的一个实例)需要一种为自身生成唯一密钥的方法。该键在线程范围内是唯一的,随后用于检索它引用的对象。这种机制用于以线程无关方式编写的代码中 既然boost是这个概念的一个可移植的例子,那么这种机制具体是如何工作的呢 Boost thread可移植到unix的pthread线程库和windows win32低级API。该库允许创建一个引用,该引用在每个执行线程中都是唯一的。在Boost的文档中,全局C API e

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


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

Boost thread可移植到unix的pthread线程库和windows win32低级API。该库允许创建一个引用,该引用在每个执行线程中都是唯一的。在Boost的文档中,全局C API errno就是这个概念的一部分

如果你想忽略它,那就忽略它——它只是通过源代码找到感兴趣的函数的一个跟踪

问题的关键从[boost]/boost/thread/tss.hpp开始,其中包含线程特定的get函数和重置函数,即分别获取和销毁引用的对象。注意:数据对象未放置在特定于线程的ptr的ctor的引用中,也未被dtor破坏。get和reset函数调用set_tss_data和get_tss_data。只关注功能的设置方面,即重要的函数调用,通过cpp文件[boost]/libs/thread/src/[libname]/thread.cpp通过一系列函数调用间接获取当前线程数据。在get_current_thread_数据中有一个函数调用create_current_thread_tls_key,该函数将为特定于线程的\u ptr对象创建唯一标识符

create_current_thread_tls_key调用win32上的TlsAlloc和pthread_key_create for pthread。这些调用确保在初始化ptr时,ptr接收到一个唯一标识符,该标识符以特定于API的方式用于检索对象的数据。特定线程API使用线程id上下文特定并由库本身解析,以及对象标识符返回特定于特定线程上下文的对象