3

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

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

有人知道更好的方法吗?

4

2 回答 2

4

即使线程被终止,您也可以获得一个不错的“终结器”来摆脱特定于线程的资源:用于RegisterWaitForSingleObject等待线程句柄的副本(通过DuplicateHandle)-您必须使用克隆的句柄,因为已注册等待无法处理句柄{没有双关语}关闭。
使用堆分配的结构/记录来保存最终资源,等待的句柄和等待句柄本身,导致终结器将在系统线程池中运行,而不是最终线程(到时候它已经死了)。并且不要忘记完成终结器:)

于 2010-07-14T10:02:25.773 回答
3

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

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

于 2010-07-13T22:04:11.927 回答