2009-08-29 154 views
2

我有一個第三方C++庫,我已經把它放入它自己的線程(目前使用NSThread)調用。我想給用戶停止執行該線程的能力。 (我很清楚這可能導致的所有問題,但我仍然希望這樣做。)如何用Objective C殺死一個線程?

根據Apple's Thread Programming Guide,Cocoa有可能這樣做。這也適用於iPhone嗎?還是我必須依靠Posix線程來完成我的目標?

乾杯

MrMage

+4

如果你認爲你想停止一個線程直接和外部沒有某種同步原語來停止它在一個已知點然後,不,你不明白它可能造成的問題。其中一個問題很可能是崩潰或損壞的內存。不可避免的如此。 – bbum 2009-08-29 18:35:46

+0

即使當我想殺死的線程(工作線程)不使用任何主線程的對象,反之亦然? 圖書館的開發者告訴我,他很高興地使用這種線程取消來阻止他的工作線程,並且他沒有遇到這樣的主要問題。 – MrMage 2009-08-29 21:46:37

+0

如果他的庫以任何方式使用任何系統庫調用,則強制殺死線程將導致未定義的行爲。這包括malloc(),甚至。即使它現在看起來有效,它是否繼續在軟件更新和體系結構更改上工作也是一個完全不同的問題。 – bbum 2009-08-30 06:35:16

回答

10

正確的方式來阻止你的線程執行是要求它很好地停止執行。然後,在你的線索中,你會聽取這樣的要求,並在適當的時候服從他們。

由於很頁面鏈接到您說:

雖然可可,POSIX,和多服務提供程序直接殺線程,使用這種程序的強烈反對。殺死一個線程可以防止線程自行清理。由該線程分配的內存可能會泄漏,並且線程當前正在使用的任何其他資源可能無法正確清理,從而在稍後創建潛在問題。

如果您預計需要在操作過程中終止線程,則應該從一開始就設計線程以響應取消或退出消息。對於長時間運行的操作,這可能意味着要定期停止工作並檢查是否收到了這樣的消息。如果消息確實要求線程退出,線程將有機會執行任何需要的清理並正常退出;否則,它可能會重新開始工作並處理下一塊數據。