• 当开始一个线程的时候,将花费几百微妙来组织类似于以下的内容:
      • 一个新的局部变量栈(Stack)
    • 线程池就可以节省这种开销:
      • 它通过预先创建一个可循环使用线程的池开减少这一开销。
    • 线程池对于高效的并行编程和细粒度开发时比不可少的
    • 它允许在不被线程启动的开销淹没的情况下运行短期操作(估计,短期操作的时间还没线程启动的时间长)

    使用线程池线程需要注意一下几点

    • 不可以设置池线程的Name
    • 池线程都是后台线程
    • 阻塞池线程可使性能降低

    • 你可以自由的更改池线程的优先级

      • 当它释放回池的时候优先级将还原为正常状态
    • 可以通过Thread.CurrentThread.IsThreadPoolThread属性来判断是否执行在线程上

    进入线程池

    • 最简单的、显示的在池线程运行代码Task.Run
      • Task.Run(()=>Console.Writeline(“Hello World!”));


    谁使用了线程池(哪些技术使用了线程池)**

    • WCF、Remoting、ASP.NET、ASMX Web Services应用服务器
    • System.Timers.Timer、System.Threadding.Timer
    • 并行编程结构
    • BackgroundWorker类(多余)
    • 异步委托 BegionInvoke?(多余)

    线程池的整洁(重要)

    • 线程池提供了另一个功能,即确保临时超出 计算-Bound的工作不会导致CPU超额订阅
    • CPU超额订阅:活跃的线程超过CPU的核数,操作系统就需要对线程进行时间切片
    • 超额订阅对性能影响很大,时间切片需要昂贵的上下文切换,并且可能使CPU缓存失效,而CPU缓存对于现代处理器的性能至关重要

    线程池的整洁 CLR的策略

    • CLR通过对任务排队并对其进行节流限制来避免线程池中的超额订阅
    • 它首先运行尽可能多的并发任务(只要还有CPU核),然后通过爬山算法调整并发级别,并在特定方向上不断调整工作负荷
      • 如果吞吐量提高,它将继续朝同一方向(否则将反转)
    • 这确保它始终追随最佳性能曲线,即使面对计算机上竞争的进程活动时也是如此
    • 如果下面两点能够满足,那么CLOR的策略将发挥出最佳效果:
      • 工作项大多时短时间运行的(<250毫秒,或者理想情况下<100毫秒),因此CLR有很多机会进行测量和调整
      • 大部分时间都被阻塞的工作项不会主宰线程池
      • (阻塞还很麻烦,它会让CLR错误的认为它逐渐使用满CPU。CLR又足够的聪明,它可以检测和补偿)