TAd*_*hav 18 .net c# clr multithreading
考虑一个创建多个应用程序域的过程.这些应用程序域是否共享相同的线程池?如果是,它如何在多个应用程序域之间协调?
Jam*_*ing 10
ThreadPool在所有应用程序域中共享 - 因为这意味着线程最终可能会在appdomains之间切换(可能经常!),其中包括:
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是此功能的主要用户).我们在这些工作队列之间进行循环,允许每个工作执行一段时间后再继续工作.[...]
顺便说一句,请注意严格来说,ThreadPool不再在整个进程中共享,因为v4 CLR允许与V2并排加载,并且每个都有自己的线程池.
线程池在所有appdomains之间共享,因为每个线程池线程都是上下文无关的,整个线程池运行时配置文件高度依赖于你运行的硬件(procs,超线程等等)
每个进程有一个线程池.线程池的默认大小为每个可用处理器25个线程.可以使用SetMaxThreads方法更改线程池中的线程数.每个线程使用默认堆栈大小并以默认优先级运行.
来源:http://msdn.microsoft.com/en-us/library/system.threading.threadpool.aspx
如果我没记错的话,CLR会在内部处理线程池线程,并在提供另一个工作请求之前清除线程上下文.