gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-29 20:18:43 26 4
gpt4 key购买 nike

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

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

有人知道更好的方法吗?

最佳答案

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

关于c++ - 无论如何在 Win32 API 中动态释放线程本地存储?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3241732/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com