【问题标题】:On which platforms does thread_specific_pointer work without boost::thread?在没有 boost::thread 的情况下 thread_specific_pointer 可以在哪些平台上工作?
【发布时间】:2017-03-17 10:38:40
【问题描述】:

boost::thread_specific_ptrdocumentation 状态(强调我的):

注意:在某些平台上,线程特定数据的清理不是 为使用平台的本机 API 创建的线程执行。在那些 平台此类清理仅适用于启动的线程 boost::thread 除非手动调用 boost::on_thread_exit() 那个线程。

哪些平台不执行清理? (动机:我想用 C++11 之前的编译器模拟 thread_local 并调用指向对象的析构函数至关重要)。

【问题讨论】:

    标签: c++ multithreading boost


    【解决方案1】:

    POSIX 线程(pthreads) 提供了清理线程本地存储的接口,所以这句话并不是指任何正确支持pthreads 的平台。

    在 Windows 上,没有用于 TLS 清理的本地 API,因此库必须求助于各种 hack 来实现这一点。从源代码(见here 了解Boost.Thread 构建为dll 的情况,here 了解它是静态库的情况)您可以看到支持MSVC 和MinGW/MinGW-w64。 dll 版本相当可移植,因此如果您在 Windows 上使用一些特殊的编译器并且 Boost.Thread 构建为静态库,则可能会缺少清理实现。

    Boost.Thread 为要求用户提供 TLS 清理实现的情况提供了指示机制。由于缺少函数boost::tss_cleanup_implemented,应用程序不会链接。当出现此类错误时,预计用户将实现 TLS 清理和此功能(空实现就足够了)。当清理由 Boost.Thread 实现时,该函数也由 Boost.Thread 定义。

    【讨论】:

    • if you use some exotic compiler on Windows, and Boost.Thread is built as a static library. - 这是否意味着支持使用 MSVC 静态构建?还是您的意思是“或”?
    • 在代码中可以看到,支持MSVC + static Boost.Thread。一些奇异的编译器 + 静态 Boost.Thread 可能不是。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-01-14
    • 2014-08-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-07-15
    • 1970-01-01
    相关资源
    最近更新 更多