我们的多线程进程在多个线程中陷入死锁,每个线程都在堆栈顶部显示下面的 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/