我试图为malloc
构建一个包装器,并想知道malloc
钩子在pthreads下是否是线程安全的。
最佳答案
__malloc_hook
在here中输入__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行中实现时,在here中: 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
正在为线程构造竞技场或选择竞技场并锁定竞技场,声明为here。因此,在设计您自己的
__malloc_hook
时,开发人员负责所有事情,包括线程锁定(如果需要)。