2010-10-08 71 views
6

由於我正在閱讀有關進程和線程的一些新主題,因此我在腦海中提出了這些問題。如果有人能幫助我,我會很高興。關於殭屍進程和線程的問題

1)如果一個線程被標記爲不可檢測,然後該進程在關鍵部分內部被終止,會發生什麼?

2)我們有一個操作系統已知的程序主線程嗎?我的意思是操作系統給程序的第一個線程一些有益的權利或什麼?

3)當我們殺死一個進程並且這些線程沒有被加入時,它們會變成殭屍嗎?

+0

此外還有另一個問題,線程如何共享正在運行的進程的堆棧?在堆棧之間切換時,堆棧是全部包含它們還是從堆棧中搶佔? – 2010-10-08 12:51:04

回答

5

首先,不要殺死或取消線程,要求他們自殺。如果你從外部殺死一個線程,你永遠不會知道什麼副作用 - 變量,同步原語的狀態等等 - 你留下來。如果你發現一個線程需要終止另一個線程,那麼讓有問題的線程檢查一個開關,捕獲一個信號,不管怎樣,並在退出之前清理它的狀態。

1)如果通過uncancelable你意味着分離,就像一個加入的線程。如果你盲目殺死它,你不知道你會留下什麼混亂。

2)從應用程序級別的角度來看,主要的問題是如果主線程退出()或返回(),它將取消所有其他線程。如果主線程用pthread_exit()自行終止,則剩下的線程繼續運行。 3)很像一個進程,線程將保留一些資源,直到它被收穫(加入)或程序結束,除非它以分離方式運行。

RE注意:線程不共享它們各自擁有的堆棧。有關線程創建的一些信息,請參閱clone()

+1

感謝您的回答,首先我不是說分開,我的意思是它將自己標記爲PTHREAD_CANCEL_DISABLE。另外通過「每個人都有自己的」,你的意思是像過程堆棧或有差異? – 2010-10-08 14:28:06

+1

對不起(1)。如果進程被殺死而不是被取消,我不認爲清理處理程序會被調用。 IOW取消點是通過pthread庫操作的;它們不會阻止該線程被操作系統所打擾。儘管如此,它會爲週末測試項目帶來不錯的效果。 AFAIK在堆棧中沒有區別,它只是每個線程的一塊連續內存。 – Duck 2010-10-08 15:26:19