2012-11-08 54 views
0

我開發了一個程序,它在開始時創建一個線程。然後我想在線程運行時用pthread_cancel()殺死線程。pthread_cancel()崩潰我的程序

如果我這樣做,我會崩潰。這次崩潰並不總是被重現。有些時候程序避免了崩潰。

我看到一些pthread_cancel()可能導致崩潰,如果取消的線程正在運行系統調用。這是真的嗎?

的dmesg顯示以下錯誤

myprogramd[1965]: segfault at c ip b76cdef3 sp bfcd5780 error 4 in libpthread-0.9.30.1.so[b76c6000+a000] 
+1

你可以張貼一些代碼? – CCoder

+0

這是很大的源代碼。但我懷疑這種崩潰是一個熟悉的崩潰,並導致'pthread_cancel()'。我認爲如果取消的線程正在運行系統調用,'pthread_cancel()可能會導致崩潰 – MOHAMED

+2

在調試器中運行該程序,以便可以捕獲*它在哪裏崩潰。這比僅僅提出隨機理論要好。 – unwind

回答

0

崩潰與管理器線程有關。在第一次啓動時管理器線程沒有被正確地殺死,所以在第二次啓動時,爬行新的線程會導致舊的線程管理器崩潰。

,請參閱以下問題了解更多詳情

How to kill the management thread with C?

0

我懷疑這是一個同步的問題。我的意思是在一個不同的線程中,這個線程依賴於你正在終止的線程,你可能正在訪問可能無效並導致崩潰的東西。除非你有完整的代碼執行,否則我們不能指出崩潰。

至少試着在gdbget the backtrace上運行您的代碼。 外觀here

0

請勿使用pthread_cancel()。重構代碼,以便它收到關閉的消息,不影響共享內存並使事情變得不穩定。