【问题标题】:Using boost::thread_specific_ptr in a non-boost thread在非增强线程中使用 boost::thread_specific_ptr
【发布时间】:2014-04-22 06:48:40
【问题描述】:

我正在阅读the documentation section for boost::thread_specific_ptr,并试图解析这一段:

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

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

更重要的是,线程到底需要做什么?将一些无操作函数传递给 at_thread_exit() 是否就足够了,还是需要传递其他东西?

(这个话题在cmetshere讨论过,但是我还是不知道我需要做什么。)

(背景故事:我正在寻找解决我提出的问题的方法earlier today)。

【问题讨论】:

    标签: c++ multithreading boost boost-thread thread-local-storage


    【解决方案1】:

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

    该评论可能是关于 Windows,其中还需要链接到 boost::thread 的共享库版本,否则特定于线程的指针不会被破坏。

    【讨论】:

    • 对不起,如果我的速度很慢,但我还没有看到我需要做什么。我的代码(我希望)能够在各种系统上运行,一些 posix 一些不能,我希望 boost 能让我写出不依赖于此的东西。这个希望现实吗? boost doco 的引用似乎表明我可以在 boost API 调用级别解决它。
    • @slyqualin 如果你使用boost::thread 来生成新线程,你不需要做任何特别的事情。我建议花一些时间阅读文档。
    • 我不知道我的用户将使用什么机制来生成他们的线程。这就是为什么我对 boost::thread_specific_ptr 如何处理 使用平台的原生 API 创建的线程(即任何类型的线程)感兴趣的原因。不幸的是,我发现与该问题相关的唯一文档是我在开头引用的神秘段落。
    【解决方案2】:

    经过一番挖掘,似乎神秘的段落确实意味着说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.
    

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

    【讨论】:

    • 请注意,这仅适用于 Windows。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-10-02
    • 2012-03-31
    • 1970-01-01
    • 1970-01-01
    • 2020-01-26
    • 2017-11-12
    • 1970-01-01
    相关资源
    最近更新 更多