__malloc_hook
вызывается сразу после ввода __libc_malloc
в здесь :
void *
__libc_malloc (size_t bytes)
{
mstate ar_ptr;
void *victim;
void *(*hook) (size_t, const void *)
= atomic_forced_read (__malloc_hook);
if (__builtin_expect (hook != NULL, 0))
return (*hook)(bytes, RETURN_ADDRESS (0));
в то время как блокировка потока реализована в __libc_malloc
20 строках ниже, в здесь :
if (SINGLE_THREAD_P)
{
victim = _int_malloc (&main_arena, bytes);
assert (!victim || chunk_is_mmapped (mem2chunk (victim)) ||
&main_arena == arena_for_chunk (mem2chunk (victim)));
return victim;
}
arena_get (ar_ptr, bytes);
arena_get
строит арену для нити или выбирает арену и запирает арену, объявленную здесь .
Таким образом, при разработке собственного __malloc_hook
разработчик несет ответственность за все, включая блокировку потоков (при необходимости).