【问题标题】:Is Thread is kernel object ?线程是内核对象吗?
【发布时间】:2012-02-17 13:50:58
【问题描述】:

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

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

谁能解释一下?

【问题讨论】:

    标签: c# .net clr


    【解决方案1】:

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

    在 .NET 2.0 中将 Thread 与实际的 Windows 线程对象解耦是非常臭名昭著的。这仅在技术上是可能的,没有人真正实现过使其工作的 CLR 主机。对于 SQL Server 团队来说,用光纤实现 Thread 是一个重要的项目,但他们放弃了。无法使其足够可靠。自从我知道之后就没有尝试过。

    【讨论】:

      【解决方案2】:

      来自MSDN关于Thread的实例:

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

      .NET 中还有其他类型的线程或类似线程的东西。有来自 ThreadPool 的线程并且有任务。 AFAIK 也没有直接绑定到操作系统线程。

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-08-06
        • 2020-03-21
        • 2021-12-09
        • 2016-05-28
        • 2013-09-08
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多