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

最佳答案

__malloc_hookhere中输入__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行中实现时,在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时,开发人员负责所有事情,包括线程锁定(如果需要)。

08-06 22:06