2012-02-18 216 views
1

我正在製作一個小項目,它將被合併到更大的項目中。基本上它跟蹤的線程是通過將它們添加到一個主結構中來創建的,這個主結構跟蹤了線程的功能(主函數)和它的pthread_t ID。另一個結構跟蹤要傳遞給函數的數據以及pthread_t id存儲在threads []中的元素編號。它有點m mouse的鼠標,它跳了一下,但它除了是時候殺死線程之外都可以工作。我沒有得到segfaults並且沒有錯誤,程序也沒有問題,但是當pthread_kill()被調用時(函數返回0意味着沒有錯誤並且它工作),線程不會被殺死,儘管線程繼續運行直到主應用程序返回。pthread_kill不殺死線程C linux

+0

'strace'是你的朋友。 – zwol 2012-02-18 23:42:38

+0

爲什麼你試圖殺死一個線程呢?如果線程正在做你想要的工作,爲什麼你想要殺死它?如果線程正在做你不想做的工作,修復它,所以它只會做你想做的工作。如果線程沒有任何工作要做,編碼就會結束。 – 2012-02-19 00:15:58

+0

在我的主要應用程序中的函數編碼在這樣一個問題,他們將優雅地退出線程,但在某些事件中,我必須強制終止線程。 – 2012-02-19 00:19:28

回答

5

pthread_kill()不會殺死一個線程。與kill()唯一的區別在於,信號由指定的線程處理,並且在該線程將信號屏蔽後不處理(請參閱pthread_sigmask())。像SIGTERM這樣的信號在默認情況下仍會終止整個過程。

如果您打算從信號處理程序調用pthread_exit(),則應該使用pthread_cancel()代替。

如果所有可能取消的代碼合作(或調用它的代碼禁止取消),取消是安全的。不過,大多數圖書館並不關心這一點。

一個更安全的方法是讓線程無需任何強制退出,例如通過向其發送特殊消息(如果線程正常處理消息)。

另外,不要打擾殺死任何線程,只需撥打_exit(),_Exit()quick_exit()

+0

請注意,'pthread_exit'不是異步信號安全的,因此您可以從信號處理程序調用它的唯一方法是如果您確保每次調用異步信號不安全函數時都會阻止信號。 – 2012-02-19 00:44:20

4

http://pubs.opengroup.org/onlinepubs/7908799/xsh/pthread_kill.html

如殺滅()中,如果簽名是零,則執行錯誤檢查,但沒有信號實際上被髮送。

所以下面

pthread_kill(線程[I] .tID,0);

不會真的殺死線程。你需要使用一個實際的信號來殺死一個線程。信號列表可以在這裏找到:

http://pubs.opengroup.org/onlinepubs/7908799/xsh/signal.h.html

+0

所以我應該發SIGKILL到我的線程使它殺死?我對信號有些困惑,儘管發送'0'意味着退出並且沒有錯誤或者圍繞這些線路 – 2012-02-18 23:55:01

+0

SIGKILL會強制線程被殺死。你也可以看看使用SIGTERM殺死一個線程。 http://rackerhacker.com/2010/03/18/sigterm-vs-sigkill/瞭解更多關於KILL和TERM之間差異的信息。 – NothingMore 2012-02-19 00:03:14

+1

信號也不能殺死一個線程。如果它殺死任何東西,它會殺死整個過程。 – 2012-02-19 00:40:54