现在,我正在积极研究内存管理器jemalloc
和tcmalloc
的代码。但是我不明白这两个管理者如何跟踪线程。
如果我理解正确,可以在分配内存的过程中检测到新线程,然后创建新的线程缓存。但是tcmalloc
/ jemalloc
如何检测线程何时被销毁,并且可以释放附加到该线程的线程缓存以备将来使用?
Google搜索结果甚至无法提供任何有用的信息。
答案 0 :(得分:0)
我只能回答jemalloc,但是它的工作方式是在创建线程缓存时,它与该线程的线程特定数据相关联。
创建线程专用数据时,可以给它一个“析构函数”,当销毁线程时调用该析构函数。如果您使用的是pthreads,则它是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
例程。