现在我正在积极研究内存管理器jemalloc和tcmalloc的代码。但是我不能理解这两个管理器是如何跟踪线程的。
如果我理解正确的话,可以在内存分配期间检测到新的线程,然后创建一个新的线程缓存。但是,tcmalloc / jemalloc如何检测线程何时被销毁,并释放附加到它的线程缓存以供将来使用呢?
谷歌的搜索结果甚至无法提供任何有用的信息。
发布于 2019-04-24 18:35:23
我只能回答jemalloc,但它的工作方式是,当创建线程缓存时,它与该线程的线程特定数据相关联。
当你创建线程特定的数据时,你可以给它一个“析构函数”,它在线程被销毁时被调用。如果您使用的是pthread,则使用pthread_key_create例程,这是创建特定于线程的数据的C方法。
在使用jemalloc的情况下,tcache.h中有一些代码,它将tcache_thread_cleanup与tcache数据挂钩(我的源代码jemalloc-3.0.0):
143 malloc_tsd_funcs(JEMALLOC_INLINE, tcache, tcache_t *, NULL,
144 tcache_thread_cleanup)因此,当线程退出时,析构函数将被调用。它将获得指向该线程的缓存的指针,并在此时运行tcache_thread_cleanup例程。
https://stackoverflow.com/questions/55827117
复制相似问题