无论如何在Win32 API中动态释放线程本地存储?

时间:2010-07-13 21:34:44

标签: c++ winapi ssl thread-local-storage

我需要在跨平台项目中使用线程本地存储。在* IX下我使用pthreads并且可以避免内存泄漏,这要归功于作为pthread_key_create的第二个参数传递的漂亮的析构函数指针,但是在Windows TlsAlloc中没有这样的东西。我也找不到在线程退出时调用任何函数的一般位置(否则我会自动添加一些在退出时调用的函数指针列表)。

就目前而言,似乎我基本上有这样一种情况:为了实际使用线程本地存储,我需要在堆上分配我自己的空间并将指针传递给TlsSetValue,但是如果线程退出。 ..我无法确保释放内存(除了在线程函数结束时显式调用TlsGetValuedelete / free / HeapFree / etc的人之外

有没有人知道更好的方法?

2 个答案:

答案 0 :(得分:3)

在线程退出时调用DLL(DLLmain)的入口点,原因码为DLL_THREAD_DETACH。编写一个跟踪函数以在线程退出时调用的DLL非常简单。

或者,使用Boost.Threadboost::this_thread::at_thread_exit函数注册要在线程退出时调用的函数,或使用boost::thread_specific_ptr完全包装TLS用法。

答案 1 :(得分:3)

即使线程被终止,你也可以找到一个很好的“终结器”来摆脱特定于线程的资源:使用RegisterWaitForSingleObject等待复制(通过{{ 1}})线程的句柄 - 你 必须 使用克隆的句柄,导致注册的等待无法处理句柄 {no pun intention} 关闭。
使用堆分配的结构/记录来保存最终资源,句柄等待和等待句柄本身,导致 终结器将在系统线程池中运行,而不是最终的线程 (到时候已经死了)。并且不要忘记最终确定终结者:)