1.每个线程的堆栈大小
使用 pthread_attr_getstacksize 查看。使用 boost::thread::attributes 来改变 (pthread_attr_setstacksize)。
2. glibc 的 malloc 中每个线程的 pre-mmap
boost.thread 的 gdb 示例
0 0x000000000040ffe0 in boost::detail::get_once_per_thread_epoch() ()
1 0x0000000000407c12 in void boost::call_once<void (*)()>(boost::once_flag&, void (*)()) [clone .constprop.120] ()
2 0x00000000004082cf in thread_proxy ()
3 0x000000000041120a in start_thread (arg=0x7ffff7ffd700) at pthread_create.c:308
4 0x00000000004c5cf9 in clone ()
5 0x0000000000000000 in ?? ()
您将data=malloc(sizeof(boost::uintmax_t));
在 get_once_per_thread_epoch ( boost_1_50_0/libs/thread/src/pthread/once.cpp )中发现
继续
1 0x000000000041a0d3 in new_heap ()
2 0x000000000041b045 in arena_get2.isra.5.part.6 ()
3 0x000000000041ed13 in malloc ()
4 0x0000000000401b1a in test () at pthread_malloc_8byte.cc:9
5 0x0000000000402d3a in start_thread (arg=0x7ffff7ffd700) at pthread_create.c:308
6 0x00000000004413d9 in clone ()
7 0x0000000000000000 in ?? ()
在 new_heap 函数 ( glibc-2.15\malloc\arena.c ) 中,它将为 64 位操作系统中的每个线程预先映射 64M 内存。换句话说,每个线程将使用64M + 8M(默认线程堆栈)= 72M。
glibc-2.15\ChangeLog.17
2009-03-13 Ulrich Drepper <drepper@redhat.com>
* malloc/malloc.c: Implement PER_THREAD and ATOMIC_FASTBINS features.
* malloc/arena.c: Likewise.
* malloc/hooks.c: Likewise.
http://wuerping.github.io/blog/malloc_per_thread.html