- CLR如何使用Windows线程
CLR使用Windows线程的功能。但CLR有权把CLR中的线程与 Windows线程分开,在某些确定的情况下,CLR的线程并不精确地映射到Windows线程。例如,主机可以告诉CLR把每个CLR线程表现为 Windows的纤程。未来版本的CLR还可能仅使用一个已存在的线程,即使你明确地要求它创建一个新线程时也这么干。另外,未来版本的CLR可能会将一 个正在等待状态的线程重新分配另一个不同的任务。因此,你应该避免调用原始的Windows函数,因它这个函数并不知道CLR线程。要坚持使用 FCL(Framework Class Library)以确保未来可以得到性能上的好处。
- CLR的线程池
一个进程一个线程池,这个线程池在本进程的所有AppDomain中共享
当 CLR初始化时,线程池中没有线程。在内部,线程池维护一个“操作请求”队列。当应用程序想要执行一个异步操作时,你调用一些方法在该列中添加一个条目。 线程池的代码将会从队列中取出一些条目,并将这些条目分给线程池中的线程。如果线程池中无线程,则新建一个。新建线程会对性能产生冲击。然而,当线程池中 的线程已经执行完任务后,它不会被销毁。相反,这个线程返回到线程池中,在那里该线程等待着响应另一个请求。由于线程不销毁它自身,此时无性能损失。
如 果应用程序给线程池产生了很多个请求,线程池会尝试用这一个线程为所有的请求服务。然而,如果应用程序产生的请求排队的速度快于线程池的线程可以处理的速 度,另外的线程就会被创建出来。应用程序最后会达到一个平衡点,在该平衡点上所有的请求可以被一个很少数量的线程处理,因此线程池就不需要创建很多线程 了。
线程池中的线程如果大约2分钟内无事可做,它会自杀。
由于线程自杀会有性能冲击,因此自杀的执行会在Idle时进行。
线程池把线程分为两类:工作线程和IO线程:工作线程执行异步“受计算限制”的操作;IO线程执行异步“受IO限制”的操作。在IO操作完成以后,会通知你的代码。
- 限制线程池中线程的数目
可以给线程池指定其中可创建线程的最大数量。
绝不应该给线程池中的线程数设置上限,因为可能会发生饿死或死锁的现象。
工作线程默认情况下25个每CPU。
IO线程最多1000个。