我的程序正在死锁,以下是死锁的前4帧:
#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
我倾向于这是一个由我做错的事情引起的问题。当服务器受到压力并达到高使用率时,我们会看到死锁,但除此之外,我们无法重现这种情况。有人知道是什么样的错误导致了这种情况吗?
根据POSIX,在多线程进程中调用fork
之后,子进程处于异步信号上下文中,如果在调用_exit
或exec
系列函数之一之前执行了除调用异步信号安全函数之外的任何操作,则会调用未定义的行为。
如果不同的执行线程以不同的顺序获取共享资源,则最常见的情况是出现死锁。在压力下表现是一个很好的指标。您拥有的支持:
A == 1 2
B == 2 1
现在,假设在a获取1
之后,但在它获取2
之前,您得到了一个线程重新调度。线程B运行并获取2
,然后控制返回到A;它现在被阻止等待由B持有的资源2,B正在等待由A持有的资源1。现在,A不能继续,B也不能;僵局
死锁的另一个原因是稍有变化,其中一个执行路径声明资源而不遵守资源锁定;这将误导其他遵循规则的执行线程。
希望这能有所帮助。