【问题标题】:Why are malloc hooks unsafe with pthreads?为什么 malloc 钩子对 pthread 不安全?
【发布时间】:2019-06-11 03:01:53
【问题描述】:

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

【问题讨论】:

  • 这取决于malloc 钩子调用的函数是否是线程安全的,不是吗? malloc() 中的核心代码必须是线程安全的;它无法控制为钩子调用的代码是否是线程安全的,但这样编写的代码应该是。
  • 您是使用 LD_PRELOAD 技巧包装 malloc,根据标签和问题文本,还是使用来自 glibc 的 __malloc_hook 东西?
  • 我正在使用 __malloc_hook fomr glibc

标签: c pthreads malloc glibc ld-preload


【解决方案1】:

here中输入__libc_malloc后立即调用__malloc_hook

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

【讨论】:

  • 问题是如果你想包装现有的malloc,你不能这样做,因为一旦你禁用了钩子,其他线程将不再调用你的包装器。
【解决方案2】:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-02
    • 2010-11-04
    • 1970-01-01
    • 2020-12-02
    • 2013-06-19
    • 1970-01-01
    相关资源
    最近更新 更多