在没有 boost::thread 的情况下 thread_specific_pointer 可以在哪些平台上工作?

Posted

技术标签:

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

boost::thread_specific_ptr 的 documentation 状态(强调我的):

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

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

【问题讨论】:

【参考方案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 可能不是。

以上是关于在没有 boost::thread 的情况下 thread_specific_pointer 可以在哪些平台上工作?的主要内容,如果未能解决你的问题,请参考以下文章

boost - thread.join() 停止用户界面

Linux 上的多核计算性能低下(openMP、boost::thread 等)

boost/thread.hpp: 没有这样的文件或目录

Boost.Thread 链接 - boost_thread 与 boost_thread-mt

将参数传递给 boost::thread 没有重载函数需要 2 个参数

boost::thread interrupt() 仅在第一次执行中断点时引发异常?