malloc_atfork里面的死锁

时间:2014-04-11 22:39:52

标签: c multithreading malloc fork

我的程序死锁,这是死锁的前四帧:

#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

我倾向于这是由于我做错了所引起的问题。我们在强调服务器并将其用于高使用率时看到了死锁,但否则我们无法重现这一点。有谁知道这会导致什么样的错误?

2 个答案:

答案 0 :(得分:1)

根据POSIX,在多线程进程中调用fork之后,子进程处于异步信号上下文中,如果除了在调用{{1之前调用异步信号安全函数之外的任何其他操作}}或其中一个_exit系列函数。

答案 1 :(得分:0)

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

A == 1 2
B == 2 1

现在,假设您在A获得1之后但在抓取2之前立即获得了一个线程重新安排。线程B运行并获取2,然后控制返回A;它现在被阻塞等待资源2,它由B持有,它等待A持有的资源1.现在,A不能继续,B也不能;死锁。

死锁的另一个原因是稍有不同,其中一个执行路径声称资源而不遵守资源锁定;这将误导遵守规则的其他执行线程。

希望这有帮助。