我们的多线程进程在几个线程中死锁,每个线程在堆栈的顶部显示下面的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 bug (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的补丁。
有没有人知道这个问题的解决方案?
发布于 2018-05-10 02:44:20
虽然这是glibc中的一个错误,但它应该不会发生,除非你在异步信号上下文中调用fork,在异步信号上下文中,它中断了已经持有malloc锁的代码,并且被中断的代码不能继续前进。否则,持有锁的是另一个线程,该线程最终应该取得前进的进展并允许fork继续。
您是否可能从信号处理程序调用popen?如果是这样的话,这不是有效的用法,您应该预料到它会在许多其他方面失败,而不仅仅是这一种。
https://stackoverflow.com/questions/50260082
复制相似问题