我需要在跨平台项目中使用线程本地存储。在* IX下我使用pthreads并且可以避免内存泄漏,这要归功于作为pthread_key_create
的第二个参数传递的漂亮的析构函数指针,但是在Windows TlsAlloc
中没有这样的东西。我也找不到在线程退出时调用任何函数的一般位置(否则我会自动添加一些在退出时调用的函数指针列表)。
就目前而言,似乎我基本上有这样一种情况:为了实际使用线程本地存储,我需要在堆上分配我自己的空间并将指针传递给TlsSetValue
,但是如果线程退出。 ..我无法确保释放内存(除了在线程函数结束时显式调用TlsGetValue
和delete
/ free
/ HeapFree
/ etc的人之外
有没有人知道更好的方法?
答案 0 :(得分:3)
在线程退出时调用DLL(DLLmain
)的入口点,原因码为DLL_THREAD_DETACH
。编写一个跟踪函数以在线程退出时调用的DLL非常简单。
或者,使用Boost.Thread和boost::this_thread::at_thread_exit
函数注册要在线程退出时调用的函数,或使用boost::thread_specific_ptr
完全包装TLS用法。
答案 1 :(得分:3)
即使线程被终止,你也可以找到一个很好的“终结器”来摆脱特定于线程的资源:使用RegisterWaitForSingleObject
等待复制(通过{{ 1}})线程的句柄 - 你 必须 使用克隆的句柄,导致注册的等待无法处理句柄 {no pun intention} 关闭。
使用堆分配的结构/记录来保存最终资源,句柄等待和等待句柄本身,导致 终结器将在系统线程池中运行,而不是最终的线程 (到时候已经死了)。并且不要忘记最终确定终结者:)