2014-04-11 67 views
0

我的程序死锁,这里是僵局的前4帧:死锁内malloc_atfork

#0 __lll_lock_wait_private() at ../nptl/sysdeps/unix/sysv/linux/x86_64/lowlevellock.S:97 
#1 0x00007f926250b7aa in _L_lock_12502() at malloc.c:3507 
#2 0x00007f926250a2df in malloc_atfork (sz=12, caller=<value optimized out>) at arena.c:217 
#3 0x00007f926250881a in __libc_calloc (n=<value optimized out>, elem_size=<value optimized out>) at malloc.c:4040 

我倾向于这是造成东西我做错了的问题。我们在强调服务器并将其用于高使用率级别时看到了僵局,但除此之外,我们无法重现这一点。有谁知道这是什么样的错误?

+0

有没有可能malloc需要真正的大数字?(例如3gb +) –

+0

@dheer:你可以在死锁时显示所有线程的调用堆栈。从这个调用堆栈看起来像这个线程是等待一些其他线程获取的锁。 –

+2

如果子进程没有立即覆盖程序映像,通常不可能在多线程程序中使用fork()。典型的世界末日场景涉及多线程内存分配器,该分配器将在分叉进程中立即中断。 –

回答

0

如果差异执行线程以不同的顺序获取共享资源,则最常发生死锁。在压力下出现是一个很好的指标。支持你:

A == 1 2 
B == 2 1 

现在,假设你得到一个线程重新安排获得1后的权利,但它抓住2之前。线程B运行并获取2,然后控制返回到A;它现在被阻塞等待资源2,该资源由等待由A持有的资源1的B持有。现在,A不能继续进行,B也不能进行。僵局。

死锁的另一个原因是这种情况稍有不同,其中一个执行路径声明资源而不尊重资源锁定;这会误导遵循规则的其他执行线程。

希望这会有所帮助。

1

每POSIX,在多线程进程调用fork后,子进程是一个异步信号情况下,如果你做的不是调用异步信号安全功能的其他任何调用_exit或一个exec之前,不确定的行为被调用家庭功能。

+0

我的程序此时不调用fork,它叫calloc。程序发送电子邮件时有一个分支,但子进程只能启动,关闭文件描述符,调用execv,然后在execv返回时退出。 – dbeer

+0

我刚刚重现了同样的问题,这次malloc_atfork()调用在我的程序中调用新的内部。在这两种情况下,也没有任何其他卡住,我实际上是调用fork()。 – dbeer

+0

你有最小的测试用例程序来重现问题吗?如果是这样的话,我可以尝试一下,如果看起来有一个真正的bug,那么就向glibc报告错误。 –