2012-02-17 66 views
2

在這本書中,我讀到Thread類的每個實例實際上是分配一個內核對象 - 這是使用Thread的開銷之一。線程是內核對象嗎?

據我所知,線程沒有內核對象(只有過程是在這種情況下一個內核對象,線程的過程包含不內核對象?)

有人能解釋一下嗎?

回答

3

線程首先是一個託管對象,您知道System.Threading.Thread類。接下來是一個內部CLR對象,一個C++類也叫做Thread。涉及冰山風格的管道相當多。該管道確實使用內核對象,其中五個。你可以在Taskmgr.exe看到。其中之一是本地操作系統線程句柄,其他四個有點神祕,但可能是同步對象句柄。

在.NET 2.0中將Thread與實際Windows線程對象解耦是相當臭名昭着的。這只是技術上可行的,沒有人知道實際上曾經實現過一個CLR主機,它使它工作。這對於SQL Server團隊來說是一個重要的項目,可以用光纖來實現Thread並且放棄它。無法讓它足夠可靠。自從我知道後,還沒有嘗試過。

2

MSDN關於螺紋的實例:

的操作系統的ThreadId具有到託管線程沒有固定的關係,因爲非託管主機可以控制管理和非管理線程之間的關係。具體而言,複雜的主機可以使用CLR Hosting API根據相同的操作系統線程安排多個託管線程,或者在不同的操作系統線程之間移動託管線程。

.NET中還有其他類型的線程或線程類的東西。 ThreadPool中有線程,還有任務。 AFAIK也不直接綁定到操作系統線程。

總之我的理解是,不,.NET線程不一定包含內核對象。