无论如何,是否可以在 Win32 API 中动态释放线程本地存储?

Can*_*ase 4 c++ ssl winapi thread-local-storage

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

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

有谁知道更好的方法吗?

Vik*_*vub 5

你可以给自己一个很好的“终结器”来摆脱线程特定的资源,即使线程被终止:使用RegisterWaitForSingleObject等待线程句柄的副本(通过) - 你必须使用克隆的句柄,因为已注册等待无法处理句柄{没有双关语意图}关闭。 使用堆分配的结构/记录来保存最终确定的资源、等待的句柄以及等待句柄本身,导致终结器将在系统线程池中运行,而不是最终确定的线程(此时该线程已经死亡)。并且不要忘记完成终结器:)DuplicateHandle