c - malloc_atfork 中的死锁

标签 c linux glibc

我们的多线程进程在多个线程中陷入死锁,每个线程都在堆栈顶部显示下面的 3 个帧。 GDB 显示另一个线程卡在 fork 中(通过 popen 调用),这可能就是调用 malloc_atfork 而不是 malloc 来分配内存的原因。

#0  0x00007f4f02c4aeec in __lll_lock_wait_private () from 
/usr/lib64/libc.so.6
#1  0x00007f4f02bc807c in _L_lock_14817 () from /usr/lib64/libc.so.6
#2  0x00007f4f02bc51df in malloc_atfork () from /usr/lib64/libc.so.6

存在一个有关 glibc 中 fork 和 malloc 之间死锁的 RedHat 错误 ( https://bugzilla.redhat.com/show_bug.cgi?id=906468 ),以及有关 malloc_atfork 中死锁的其他报告。

这个链接,https://sourceware.org/ml/libc-alpha/2016-02/msg00269.html ,从 2016 年 2 月开始,包含一个用于删除 malloc_atfork 的补丁。

有谁知道这个问题的解决办法吗?

最佳答案

虽然这是 glibc 中的一个错误,但它应该不会发生,除非您从异步信号上下文调用 fork 时,它会中断已经持有 的代码。 malloc 锁和被中断的代码无法继续前进。否则,它是另一个线程持有锁,并且该线程最终应该向前推进并允许fork继续。

您是否可能从信号处理程序调用popen?如果是这样,那么这不是有效的用法,您应该预期它会以许多其他方式失败,而不仅仅是这一种。

关于c - malloc_atfork 中的死锁,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50260082/

相关文章:

c - C 标准库中的任何函数是否隐式使用 `stderr` ?

c - 未检测到 ThreadSanitizer 死锁并且最终没有结果(由于死锁程序)

PHP 片段问题

glibc - 在 CentOS6 中运行 chromedriver : "/lib64/libc.so.6: version ` GLIBC_2. 1 4' not found"时出错

c - 为什么 fseeko() 会失败并显示 EINVAL?

c - Segmentation Fault a.k.a Bus Error,错误还是故障?

C程序空解析

c - 我不明白这个算法的时间复杂度是如何计算的

通过引用调用一个变量,该变量在不使用全局变量的情况下被另一个函数通过引用调用

c++ - 堆栈、高速缓存未命中和虚拟内存