2010-01-12 23 views

回答

0

不,除非父線程是應用程序的主線程。

+0

不,沒有「主線程」的概念。 – wj32 2010-01-12 11:08:12

+0

在Windows上,存在主線程或主線程的概念。檢查http://msdn.microsoft.com/en-us/library/ms682425(VS.85).aspx – jrbjazz 2010-01-12 11:12:58

+0

擴展我以前的評論:在Windows進程中,生命週期完全由它的線程決定 - 這個過程被認爲是當其最後一個線程終止時「終止」。 CreateProcess的文檔說「主線程」,因爲CreateProcess創建一個進程*和*一個初始線程,因爲這是有道理的。事實上,您可以使用NtCreateProcess創建一個沒有線程的進程。但我在這裏進入了太多低級細節。 – wj32 2010-01-12 11:13:45

5

在記錄信息方面,Windows中沒有「父線程」這樣的東西。甚至沒有嚴格的「父進程」的概念--Windows不記錄創建者進程,只記錄繼承了屬性和句柄的進程。所以答案是否定的。

編輯:一個例子應該說清楚:你可以在另一個進程中創建一個線程,而不僅僅是你自己的。顯然,線程終止時線程不會終止。

1

否 - 線程屬於一個進程,而不屬於其他線程。如果創建它們的線程終止,線程不會終止。

線程終止時:

  • 線程功能退出(正常或通過一個例外)。
  • 線程調用ExitThread或另一個結束線程的函數。
  • 任何線程都使用正在討論的線程的ID來調用TerminateThread函數。
  • 該過程結束。
+0

很好的答案,除了最後一個項目。閱讀我對jrbjazz的回答的評論。當所有線程退出時,該進程被認爲是「終止」,而不是相反。如果可以的話,我還想做出另一個評論:ExitThread只是TerminateThread的一個包裝。所以線程只有一種退出方式,那就是通過TerminateThread。 – wj32 2010-01-12 11:20:19

+0

@ wj32 - 關於最後一點,我正在考慮在線程所屬的進程上調用「TerminateProcess」。 – 2010-01-12 11:46:59

+0

啊是的。但在內核中,您可以看到NtTerminateProcess只是終止進程的線程;) – wj32 2010-01-12 11:53:33

0

從的CreateThread()Windows API函數的MSDN描述:

「線程對象仍保留在系統中,直到線程終止,所有的句柄它已通過對CloseHandle的調用關閉。 「

我對CreateThread的工作原理的理解是,您基本上要求Windows生成一個線程併爲您希望線程調用的函數分配一個指針。當這個過程完成後,你「禮貌地」告訴Windows你不再需要這個線程。

所以,我想這一切都歸結到應用程序的寫法。使用提供線程包裝的有用的開發語言將消除很多不確定性,特別是如果通過對象提供線程並在應用程序終止時收集適當的垃圾。

就操作系統而言,我同意「wj32」本身確實沒有主線程,但我猜應用線程本身可以被看作概念上的「主線程」,提供應用程序適當地管理線程資源分配。

+0

我想添加終止!=線程對象已釋放。一個線程對象可以在終止之後繼續運行,並且不會影響進程的生命週期(儘管它也可以確保進程對象掛起)。 – wj32 2010-01-12 11:31:01