线程池如何管理线程

时间:2024-03-25 21:29:14

本篇介绍一下CLR中,线程池是如何管理线程的。在介绍之前,先说明下线程池的设置。

一:线程池设置:

一般不建议设置线程数,就像从来都不会限制程序使用的内存量,或限制使用的网络带宽。
1:默认拥有的线程数大约是1000个线程。
2:32位进程最多能够有大约1360个线程。
3:64位进程理论上可以创建千百万个线程。

二:如何管理工作者线程:

我们先了解下全局对列和本地对列的区别:
1:全局对列:

  1. 工作者线程采用先入先出的算法从对列取出工作项,并处理他们。
  2. 所有工作者都竞争一个同步锁,以保证多个线程不会获取同一个工作项。
  3. QueueUserWorkItem方法和Timer总是将工作项放入全局对列。
  4. 非工作者线程调度一个task时,该task被添加到全局对列。

2:本地对列:

  1. 工作者线程采用后入先出的算法从对列取出工作项,并处理他们。
  2. 不需要同步锁,因此在对列添加和删除task的速度比较快。

3:CLR线程池的结构图:
线程池如何管理线程
4:重点来了,工作者线程的工作流程,如下图所示:
工作者线程先从本地对列获取工作项,如果获取到则处理,如果获取不到,则到其他工作者线程的本地对列“偷”工作项,如果获取到则处理,如果获取不到,则到全局对列获取工作项,如果获取到则处理,如果获取不到则进入睡眠,如果睡眠时间长,它会自己想来,并销毁自身。
线程池如何管理线程

如上就是我对工作者线程工作原理的理解,哪里不对,还请指教。