threadpool是否在应用程序域之间共享?

时间:2010-08-10 09:01:35

标签: c# .net multithreading clr

考虑创建多个应用程序域的过程。这些应用程序域是否共享相同的线程池?如果是,它如何在多个应用程序域之间协调?

3 个答案:

答案 0 :(得分:10)

ThreadPool在所有应用程序域中共享 - 因为这意味着线程最终可能会在应用程序域之间切换(可能经常!),因此已经解决了这个问题:

http://blogs.msdn.com/b/ericeil/archive/2009/04/23/clr-4-0-threadpool-improvements-part-1.aspx

  

[...]事实上,我们违反了这个“规则”   已经:从.NET 3.5开始,CLR   线程池一直保持独立   每个AppDomain的FIFO队列   过程,另外一个独立的   “本机”工作项的FIFO队列   例如那些由主机排队的人   (ASP.net是这个的主要用户   特征)。我们之间进行轮循   这些工作队列,允许每个人   之前执行工作一段时间   继续下一个。[...]

BTW,请注意严格来说,ThreadPool不再在整个进程中共享,因为v4 CLR允许与V2并排加载,并且每个都有自己的线程池。

答案 1 :(得分:5)

线程池在所有appdomains之间共享,因为每个线程池线程都是上下文无关的,整个线程池运行时配置文件高度依赖于你运行的硬件(procs,超线程等等)

  

每个进程有一个线程池。   线程池的默认大小为   每个可用处理器25个线程。   线程中的线程数   游泳池可以改变使用   SetMaxThreads方法。每个线程使用   默认的堆栈大小并在   默认优先级。

来源:http://msdn.microsoft.com/en-us/library/system.threading.threadpool.aspx

如果我没记错的话,CLR会在内部处理线程池线程,并在提供另一个工作请求之前清除线程上下文。

答案 2 :(得分:0)

不是100%肯定,但我认为线程池是 每个进程一次,而不是每个AppDomain一次。请尝试查看thread & appdomain上的这篇文章: