Windows线程池和CLR线程池有什么区别?

9

我阅读了一些关于窗口线程池的内容。它看起来像CLR线程池。

CLR基于Windows,所以CLR线程是基于Windows线程池的,对吗?

我知道每个 .net 进程都有一个线程池,那么Windows线程池的情况如何?操作系统有一个线程池还是多个线程池?

在C#中,开发人员能通过代码控制Windows线程池吗?


3
询问阅读材料时,请提供链接或至少提供出版物名称。 - H H
1个回答

17
这是一个没有直接答案的CLR实现问题。CLR不负责确定线程池的实现方式,而是由CLR主机负责。CLR主机是将CLR与操作系统集成的软件层。CLR用于完成线程池任务的核心接口是IHostThreadPoolManager。它是一个非托管的COM接口,但你会很容易地发现它与ThreadPool类成员几乎一一对应。
有许多CLR主机实现。其中比较常见的是桌面应用程序的默认CLR主机,由mscoree.dll实现。不同的Windows版本有不同的版本。ASP.NET、Sql Server、Visual Studio Hosting过程、Silverlight的自定义主机、Windows Phone、XBox等都有不同的CLR主机。还有一些不太常见的,大型的非托管应用程序可以自己托管CLR,以支持使用.NET语言实现的脚本。CAD程序如AutoCAD等是标准示例。

线程的核心概念在CLR中进行了虚拟化。IClrTask和IClrTaskManager是托管这一概念的接口,使得主机可以在除操作系统线程之外的其他地方实现线程,如纤程(fiber)。不过实际上几乎没有人这样做。

当然,Windows有自己的线程池API。CreateThreadPool() WinAPI函数可以启动此功能。然而,在我的计算机上使用dumpbin.exe /imports查看mscor*.dll文件时,并没有发现它被使用。至少部分问题可能是CreateThreadPool()是后来的WinAPI函数,只能在Vista及更高版本中使用。XP及早期的Windows版本有一个简单得多的实现。因此,在桌面版.NET 4.5.2中,似乎并没有使用Windows线程池。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接