在非boost线程中使用boost::thread_specific_ptr

Using boost::thread_specific_ptr in a non-boost thread

本文关键字:boost thread ptr specific 线程 在非      更新时间:2023-10-16

我正在阅读boost::thread_specific_ptr的文档部分,并试图解析这段:

注意:在某些平台上,使用平台的本机API创建的线程不会执行特定于线程的数据清理。在这些平台上,这种清理只对以boost::thread启动的线程执行,除非从该线程手动调用boost::on_thread_exit()。

首先,这可能是一个迂腐的观点:我假设他们想说的是boost::this_thread::at_thread_exit()而不是boost::on_thread_exit()。否则我真的迷路了。

更重要的是,线程到底需要做什么?向at_thread_exit()传递一些无操作函数是否足够,或者它是否需要传递其他东西?

(这个话题在这里的评论中讨论过,但我仍然不确定我需要做什么。)

(背景故事:我正在寻找解决我今天早些时候提出的问题的方法)。

经过进一步的挖掘,似乎这段神秘的段落确实是指on_thread_exit()。它引用了一个未记录的函数,该函数不带参数。

下面是该函数的声明和附带的注释,来自boost_1_55_0/boost/thread/detail/tss_hooks.hpp:
BOOST_THREAD_DECL void __cdecl on_thread_exit(void);
    //Function to be called just be fore a thread ends
        //in an exe or dll that uses Boost.Threads.
    //Must be called in the context of the thread
        //that is ending.
    //Called automatically by Boost.Threads when
        //a method for doing so has been discovered.
    //Must not be omitted; may be called multiple times.

因此,我需要做的是编写特定于平台的代码,当任何类型的线程终止时,如果该线程一直在使用boost::thread_specific_ptr,则触发对该函数的调用。

当线程退出时,它需要销毁线程特定指针的值。在POSIX系统上,这是由创建线程特定键时注册的析构函数完成的,参见http://pubs.opengroup.org/onlinepubs/007904975/functions/pthread_key_create.html,也就是说,该注释不适用于POSIX系统。

这个注释可能是关于Windows的,在Windows中也需要链接到boost::thread的共享库版本,否则线程特定的指针不会被销毁。