现在我正在积极研究内存管理器的代码jemalloc
和tcmalloc
. 但我不明白这两位经理是如何跟踪线程的。
如果我理解正确,可以在内存分配期间检测到一个新线程,然后创建一个新的线程缓存。但是tcmalloc
/如何jemalloc
检测线程何时被销毁并且可以释放附加到它的线程缓存以供将来使用?
谷歌搜索结果甚至不能提供任何有用的信息。
现在我正在积极研究内存管理器的代码jemalloc
和tcmalloc
. 但我不明白这两位经理是如何跟踪线程的。
如果我理解正确,可以在内存分配期间检测到一个新线程,然后创建一个新的线程缓存。但是tcmalloc
/如何jemalloc
检测线程何时被销毁并且可以释放附加到它的线程缓存以供将来使用?
谷歌搜索结果甚至不能提供任何有用的信息。
我只能回答 jemalloc,但它的工作方式是,当创建线程缓存时,它与该线程的线程特定数据相关联。
当你创建线程特定的数据时,你可以给它一个“析构函数”,当线程被销毁时调用它。如果您使用 pthreads,它是pthread_key_create例程,它是创建线程特定数据的 C 方式。
在 jemalloc 的情况下,有一些代码,它与数据tcache.h
挂钩(我的源代码 jemalloc-3.0.0):tcache_thread_cleanup
tcache
143 malloc_tsd_funcs(JEMALLOC_INLINE, tcache, tcache_t *, NULL,
144 tcache_thread_cleanup)
所以当线程退出时,析构函数被调用。它获得指向该线程缓存的指针并tcache_thread_cleanup
在那时运行例程。