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

时间:2017-03-17 10:38:41

标签: c++ multithreading boost

boost::thread_specific_ptrdocumentation州(强调我的):

  

注意:某些平台上的 ,特定于线程的数据的清理不是   为使用平台的本机API创建的线程执行。在那些   这样的清理平台只对启动的线程完成   boost :: thread,除非手动调用boost :: on_thread_exit()   那个帖子。

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

1 个答案:

答案 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定义。