为什么malloc钩子对pthreads不安全?

时间:2019-01-16 23:37:29

标签: c pthreads malloc glibc ld-preload

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

2 个答案:

答案 0 :(得分:3)

here中输入__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行中,在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时,开发人员应对一切负责,包括线程锁定(如果需要)。

答案 1 :(得分:3)

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

  

在多线程程序中使用这些钩子函数并不安全,现已弃用。程序员应该改为通过定义和导出诸如“ malloc”和“ free”之类的功能来抢占相关功能。