[英]Deadlock in malloc_atfork
我们的多线程进程死锁在多个线程中,每个线程在堆栈顶部显示下面的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中的死锁的其他报告。
从2016年2月开始,此链接https://sourceware.org/ml/libc-alpha/2016-02/msg00269.html包含一个用于删除malloc_atfork的补丁程序。
有谁知道解决这个问题的方法吗?
尽管这是glibc中的错误,但除非从异步信号上下文中调用fork
,否则它应该不会发生,在异步信号上下文中,该示例的中断代码已持有malloc
锁,而该中断代码无法向前进行。 否则,这是另一个持有锁的线程,该线程最终应前进并允许fork
继续。
您可能从信号处理程序调用popen
吗? 如果是这样,那将是无效的用法,您应该期望它能够以许多其他方式失败,而不仅仅是这种方式。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.