现在我正在积极研究内存管理器jemalloc
和tcmalloc
的代码。但我无法理解这两个管理器如何跟踪线程。
如果我理解正确的话,在内存分配期间可以检测到一个新线程,然后创建一个新的线程缓存。但是,tcmalloc
/jemalloc
如何检测线程何时被销毁以及附加到它的线程缓存可以被释放以供将来使用?
Google 结果无法提供哪怕是最起码的有用信息。
最佳答案
我只能回答jemalloc,但它的工作方式是,当创建线程缓存时,它与该线程的线程特定数据相关联。
当你创建线程特定数据时,你可以给它一个“析构函数”,当线程被销毁时会调用它。如果您使用 pthreads,则为 pthread_key_create例程,这是创建线程特定数据的 C 方法。
对于 jemalloc,tcache.h
中有一些代码,它将 tcache_thread_cleanup
与 tcache
数据 Hook (我的源码jemalloc-3.0.0):
143 malloc_tsd_funcs(JEMALLOC_INLINE, tcache, tcache_t *, NULL,
144 tcache_thread_cleanup)
因此,当线程退出时,析构函数将被调用。它获得指向该线程缓存的指针,并在那时运行 tcache_thread_cleanup 例程。
关于c - jemalloc 和 tcmalloc 如何跟踪线程?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55827117/