Thread是内核对象吗?

在本书中,我读到Thread类的每个实例实际上都在分配一个内核对象 – 这是使用Thread的开销之一。

据我所知,该线程不是内核对象(在这种情况下,只有进程是一个内核对象。进程包含的线程不是内核对象?)

谁能解释一下?

Thread首先是一个托管对象,你知道System.Threading.Thread类。 接下来是一个内部CLR对象,一个名为Thread的C ++类。 冰山风格相当大量的管道。 那个管道肯定使用内核对象,其中五个。 你可以在Taskmgr.exe中看到的东西。 其中一个是本机操作系统线程句柄,其他四个有点神秘,但可能是同步对象句柄。

Thread与.NET 2.0中的实际Windows线程对象的分离非常臭名昭着。 只有技术上可行,没有人知道实际上曾经实现过使其工作的CLR主机。 这是SQL Server团队使用光纤实现Thread的一个重要项目,他们放弃了它。 无法使它足够可靠。 从那以后我没有尝试过。

从MSDN关于Thread的实例:

操作系统ThreadId与托管线程没有固定关系,因为非托管主机可以控制托管和非托管线程之间的关系。 具体而言,复杂的主机可以使用CLR Hosting API针对同一操作系统线程调度许多托管线程,或者在不同操作系统线程之间移动托管线程。

.NET中还有其他类型的线程或类似线程的东西。 ThreadPool中有线程,还有Tasks。 两者都不是AFAIK直接绑定到OS线程。

总而言之,我对此的理解是,不,.NET线程不一定包含内核对象。