代码之家  ›  专栏  ›  技术社区  ›  Hassan Syed

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

  •  0
  • Hassan Syed  · 技术社区  · 14 年前

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

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

    1 回复  |  直到 14 年前
        1
  •  0
  •   Hassan Syed    14 年前

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


    如果需要,可以忽略--这只是通过源代码找到感兴趣函数的跟踪

    问题的关键在于 [boost]/boost/thread/tss.hpp get 功能 thread_specific_ptr 以及 reset 功能——即,分别获取和销毁被引用对象。注意:数据对象不在 特定线程 或被DTOR销毁。get和reset函数调用 set_tss_data get_tss_data . 只关注功能的设置方面,重要的功能调用, get_current_thread_data ,通过cpp文件间接 [boost]/libs/thread/src/[libname]/thread.cpp 通过一系列函数调用。在 获取当前线程数据 有一个函数调用 create_current_thread_tls_key 这个函数将为 特定线程 对象。


    创建当前线程密钥 电话 TlsAlloc() 在Win32上 link ) pthread_key_create 对于pthread( link )。这些调用确保在ptr初始化时,ptr接收到一个惟一的标识符,该标识符可用于以api特定的方式检索对象的数据。特定线程api使用线程id(特定于上下文并由库本身解析)和对象标识符返回特定于某个线程的上下文的对象。