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

5
我正在阅读boost::thread_specific_ptr文档部分,并尝试解析此段落:
注意:在某些平台上,对于使用平台本机API创建的线程,不会执行线程特定数据的清除。在这些平台上,只有在使用boost::thread启动的线程才会进行此类清除,除非从该线程手动调用boost::on_thread_exit()。
首先,可能是一个小题目:我认为他们的意思是boost::this_thread::at_thread_exit()而不是boost::on_thread_exit()。否则我真的迷失了。
更重要的是,线程需要做什么?它是否足以将一些无操作函数传递给at_thread_exit(),还是需要传递其他内容?
(此主题在此处的评论中已经讨论过,但我仍然不确定我需要做什么。)

背景:我正在寻找一个解决方案来解决我今天早些时候提出的问题。

2个回答

1
经过更深入的调查,似乎那个神秘的段落确实是要说 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

请注意,这仅适用于Windows操作系统。 - jupp0r

0

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

该注释可能是关于 Windows 的,因为在 Windows 上,还需要链接到共享库版本的 boost::thread,否则线程特定指针将无法被销毁。


抱歉如果我有点慢,但我还没有看到我需要做什么。我的代码(希望)将在各种系统上运行,一些是posix,一些不是,我希望boost可以让我编写不依赖于它的东西。这个希望现实吗?来自boost文档的引用似乎表明我可以在boost API调用的级别解决它。 - slyqualin
@slyqualin 如果你使用 boost::thread 来生成新线程,那么你不需要做任何特殊的事情。我建议花些时间阅读文档。 - Maxim Egorushkin
我不知道我的用户将使用什么机制来生成他们的线程。这就是为什么我对boost::thread_specific_ptr如何与使用平台本地API(即任何类型的线程)创建的线程行为感兴趣。不幸的是,我找到的唯一与该问题相关的文档是我在开头引用的那个神秘段落。 - slyqualin

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接