简体   繁体   中英

How do jemalloc and tcmalloc track threads?

Now I am actively studying the code of memory managers jemalloc and tcmalloc . But I can't understand how these two managers track threads.

If I understand correctly, a new thread can be detected during memory allocation, after which a new thread cache is created. But how does tcmalloc / jemalloc detect when a thread is destroyed and the thread cache attached to it can be freed for a future use?

Google results could not give even a minimum of any useful information.

I can only answer for jemalloc, but the way it works is that when the thread cache is created it is associated with the thread specific data for that thread.

When you create thread specific data, you can give it a 'destructor', which is invoked when the thread is being destroyed. If you're using pthreads it's the pthread_key_create routine, which is the C way of creating thread specific data.

In the case of jemalloc, there is a bit of code in tcache.h , which hooks tcache_thread_cleanup with the tcache data (my source jemalloc-3.0.0):

143 malloc_tsd_funcs(JEMALLOC_INLINE, tcache, tcache_t *, NULL,
144     tcache_thread_cleanup)

So when the thread is exited, the destructor gets called. It gets given the pointer to the cache for that thread and runs the tcache_thread_cleanup routine at that time.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM