boost::thread_specific_ptr
个documentation州(强调我的):
注意:某些平台上的 ,特定于线程的数据的清理不是 为使用平台的本机API创建的线程执行。在那些 这样的清理平台只对启动的线程完成 boost :: thread,除非手动调用boost :: on_thread_exit() 那个帖子。
这些没有执行清理的平台是什么? (动机:我想用前C ++ 11编译器模拟thread_local
并调用指向对象的析构函数是至关重要的。)
答案 0 :(得分:2)
POSIX线程(pthreads)提供了清理线程本地存储的接口,因此这条评论并未引用任何正确支持pthread的平台。
在Windows上,没有用于TLS清理的本机API,因此库必须采用各种方法来实现此目的。从源代码(对于将Boost.Thread构建为dll时的情况,请参阅here,以及当它是静态库时为here),您可以看到支持MSVC和MinGW / MinGW-w64 。 dll版本是相当可移植的,因此如果你在Windows上使用一些奇特的编译器并且Boost.Thread被构建为一个静态库,那么清理实现可能会丢失。
Boost.Thread为需要用户提供TLS清理实现的情况提供指示机制。由于缺少函数boost::tss_cleanup_implemented
,应用程序将不会链接。当出现这样的错误时,用户应该实现TLS清理和此功能(并且空实现就足够了)。当清理由Boost.Thread实现时,该函数也由Boost.Thread定义。