c-malloc_atfork内部的死锁



我的程序正在死锁,以下是死锁的前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之后,子进程处于异步信号上下文中,如果在调用_exitexec系列函数之一之前执行了除调用异步信号安全函数之外的任何操作,则会调用未定义的行为。

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

A == 1 2
B == 2 1

现在,假设在a获取1之后,但在它获取2之前,您得到了一个线程重新调度。线程B运行并获取2,然后控制返回到A;它现在被阻止等待由B持有的资源2,B正在等待由A持有的资源1。现在,A不能继续,B也不能;僵局

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

希望这能有所帮助。

相关内容

  • 没有找到相关文章

最新更新