c-为什么malloc钩子在pthreads中不安全



我正在尝试为malloc构建一个包装器,并想知道malloc钩子在pthreads下是否是线程安全的。

__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_malloc20行中实现的,在这里:

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时,开发人员负责一切,包括线程锁定(如果需要)。

无论如何都不应该使用它们;它们已被弃用。参见the malloc_hook(3) man page:的任何最新副本的"注释"部分

在多线程程序中使用这些钩子函数是不安全的,现在已经弃用了。相反,程序员应该通过定义和导出诸如"malloc"one_answers"free"之类的函数来抢占对相关函数的调用。

相关内容

  • 没有找到相关文章