【发布时间】:2018-01-24 07:47:53
【问题描述】:
在 MSDN 中阅读以下页面:
Using Thread Local Storage in a Dynamic-Link Library
我不明白在FreeLibrary()调用的情况下谁负责释放每个线程的TLS槽指向的内存。
据我了解,如果我有多个正在运行的线程,它们都会在给定索引中的 TLS 插槽内分配内存。当FreeLibrary()被调用时,只有DLL_PROCESS_DETACH被触发,所以只有收到DLL_PROCESS_DETACH通知的线程才有机会对自己存储在TLS槽中的数据调用LocalFree(),然后再调用TlsFree()指数。这会导致所有其他没有机会对其数据调用LocalFree() 的线程中的内存泄漏,因为它们没有收到DLL_THREAD_DETACH 通知。
有人能解释一下何时何地应该释放存储在每个线程的 TLS 插槽中的缓冲区吗?
【问题讨论】:
-
如果您的 DLL 将数据分配给某个线程 - 在未释放该数据(在线程退出时)之前,不得卸载它。因此,在这种情况下根本不能卸载您的 DLL。或者当您将数据分配给线程时,您需要增加对 DLL 的引用计数。并在释放此数据时减少对 DLL 的引用计数
标签: c multithreading winapi thread-local-storage