2012-02-17 71 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线程不一定包含内核对象。