【发布时间】:2012-02-17 13:50:58
【问题描述】:
在本书中,我读到Thread 类的每个实例实际上都在分配一个内核对象——这是使用Thread 的开销之一。
据我所知,线程不是内核对象(在这种情况下只有进程是内核对象。进程包含的线程不是内核对象?)
谁能解释一下?
【问题讨论】:
在本书中,我读到Thread 类的每个实例实际上都在分配一个内核对象——这是使用Thread 的开销之一。
据我所知,线程不是内核对象(在这种情况下只有进程是内核对象。进程包含的线程不是内核对象?)
谁能解释一下?
【问题讨论】:
Thread首先是一个托管对象,你知道System.Threading.Thread类。接下来是一个内部 CLR 对象,一个 C++ 类,也称为 Thread。它涉及大量的管道,冰山风格。该管道肯定使用内核对象,其中五个。你可以在Taskmgr.exe 中看到一些东西。其中一个是本机操作系统线程句柄,其他四个有点神秘但可能是同步对象句柄。
在 .NET 2.0 中将 Thread 与实际的 Windows 线程对象解耦是非常臭名昭著的。这仅在技术上是可能的,没有人真正实现过使其工作的 CLR 主机。对于 SQL Server 团队来说,用光纤实现 Thread 是一个重要的项目,但他们放弃了。无法使其足够可靠。自从我知道之后就没有尝试过。
【讨论】:
来自MSDN关于Thread的实例:
操作系统 ThreadId 与托管线程没有固定关系,因为非托管主机可以控制托管线程和非托管线程之间的关系。具体来说,复杂的主机可以使用 CLR Hosting API 针对同一操作系统线程调度多个托管线程,或在不同操作系统线程之间移动托管线程。
.NET 中还有其他类型的线程或类似线程的东西。有来自 ThreadPool 的线程并且有任务。 AFAIK 也没有直接绑定到操作系统线程。
总而言之,我对此的理解是,不,.NET 线程不一定包含内核对象。
【讨论】: