我们的多线程进程在多个线程中死锁,每个线程在堆栈顶部显示下面的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
有一个RedHat错误(https://bugzilla.redhat.com/show_bug.cgi?id=906468)关于fork和malloc之间的glibc中的死锁以及有关malloc_atfork中死锁的其他报告。
此链接https://sourceware.org/ml/libc-alpha/2016-02/msg00269.html,自2016年2月起,包含一个用于删除malloc_atfork的补丁。
有没有人知道这个问题的解决方案?
答案 0 :(得分:4)
虽然这是glibc中的一个错误,但除非您从异步信号上下文调用fork
,否则它应该无法发生,因为它已经中断了已经持有{{{ 1}}锁定和中断的代码无法前进。否则,它是另一个持有锁的线程,该线程最终应该向前推进并允许malloc
继续。
您是否可能从信号处理程序中调用fork
?如果是这样,那就没有用了,你应该期望它能够以许多其他方式失败,而不仅仅是这个。