2017-03-17 40 views
0

boost::thread_specific_ptrdocumentation国家(重点煤矿):在没有boost :: thread的情况下,thread_specific_pointer在哪些平台上工作?

注:在某些平台上,线程特定数据的清理并不 与该平台的原生API创建的线程执行。在那些 平台上,这种清理只针对以 boost :: thread开头的线程完成,除非boost :: on_thread_exit()是从 手动调用的那个线程。

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

回答

2

POSIX线程(pthreads)提供了用于清理线程本地存储的接口,所以这个注释并不涉及任何平台正确支持pthread。

在Windows上没有用于TLS清理的本机API,因此库必须使用各种黑客来实现这一点。从源代码(请参见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定义。

+0

'如果你在Windows上使用了一些特殊的编译器,并且Boost.Thread被构建为静态库。“ - 这是否意味着支持使用MSVC静态构建?还是你的意思是“或”? –

+1

正如您在代码中看到的,支持MSVC +静态Boost.Thread。一些异国情调的编译器+静态Boost.Thread可能不是。 –

相关问题