2014-04-11 91 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報告錯誤。 –