c - jemalloc 和 tcmalloc 如何跟踪线程?

标签 c multithreading tcmalloc jemalloc

现在我正在积极研究内存管理器jemalloctcmalloc的代码。但我无法理解这两个管理器如何跟踪线程。

如果我理解正确的话,在内存分配期间可以检测到一个新线程,然后创建一个新的线程缓存。但是,tcmalloc/jemalloc 如何检测线程何时被销毁以及附加到它的线程缓存可以被释放以供将来使用?

Google 结果无法提供哪怕是最起码的有用信息。

最佳答案

我只能回答jemalloc,但它的工作方式是,当创建线程缓存时,它与该线程的线程特定数据相关联。

当你创建线程特定数据时,你可以给它一个“析构函数”,当线程被销毁时会调用它。如果您使用 pthreads,则为 pthread_key_create例程,这是创建线程特定数据的 C 方法。

对于 jemalloc,tcache.h 中有一些代码,它将 tcache_thread_cleanuptcache 数据 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/

相关文章:

c - STM32F103 Timer2不中断

c++ - C++中的简单线程工作

c++ - 为什么 tcmalloc 不打印通过 dlopen 提供的函数名称

c++ - 来自 tcmalloc 的意外行为

javascript - galois 字段 galois_mul2 转换为 javascript?

c - 何时释放 mex 文件中分配的内存

java - 与 Java 中的多处理相比,多线程性能较差

c# - ThreadPool.QueueUserWorkItem——是否需要新的 WaitCallback()?

ios - ptmalloc、tcmalloc、dmalloc、HOARD 或 nedmalloc? (在 iOS 和 Android 游戏上)

c - 在 ubuntu 终端窗口中运行文件之前如何消除使用 "./"的需要?