当我们通过ThreadPool
或Task.Run
或Thread
对象在.NET中创建线程时,该线程是映射到单个Windows线程还是可以映射到多个线程?换句话说,.Net CLR的Threading Model是什么?
有人可以在这里阐明一下吗?
PS :有人问过here关于JVM
的类似问题,但我找不到.NET
的类似问题。
答案 0 :(得分:2)
默认情况下,每个托管线程都映射到单个OS线程。但是,通过使用CLR托管API,您可以将托管线程迁移到其他本机OS线程。
来自MSDN:
操作系统ThreadId与托管对象没有固定关系 线程,因为非托管主机可以控制之间的关系 托管和非托管线程。具体来说,复杂的主机可以 使用CLR Hosting API来针对 相同的操作系统线程,或在两个线程之间移动托管线程 不同的操作系统线程。
但是,您可以通过调用Thread.BeginThreadAffinity来要求CLR不要将托管线程移动到另一个OS线程。
这意味着.NET线程模型为N:M。