- 当开始一个线程的时候,将花费几百微妙来组织类似于以下的内容:
- 一个新的局部变量栈(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又足够的聪明,它可以检测和补偿)