boost 线程静态库不能与 C++/CLI 代码一起使用,因为它使用线程本地存储回调来清理线程特定的数据。可以通过在构建 boost 库时排除 tss_pe.obj 来禁用这些回调,这允许库在托管代码中使用,但这意味着需要手动清理这些资源。
这些都没有正式记录,但我从各种错误/论坛帖子(例如https://svn.boost.org/trac/boost/ticket/1848 )拼凑而成,此手动清理需要:
- 在退出“不受 boost::thread 管理”的线程时调用 on_thread_exit()。我不清楚这到底意味着什么,或者为什么 Boost 线程会负责清理它没有管理的线程的资源。
- 也可能在 main ( http://lists.boost.org/Archives/boost/2007/11/130440.php )的开头和结尾调用 on_process_enter 和 on_process_exit 。
作为一个以前没有使用过线程本地存储的库的新用户,我想确保我完全理解这些简洁的指导方针。我将使用来自 COM DLL 中非托管代码的 boost 线程,该 DLL 还包含几个托管类。
有人可以通过示例提供更详细的解释,说明在禁用自动清理时我需要调用上述函数以避免资源泄漏的确切情况?