您的位置:首页 > 编程语言

线程池实现代码分析(一)

2012-03-26 13:25 218 查看
线程池实现代码分析(一)
线程池是一种多线程处理形式,处理过程中将任务添加到队列,然后在创建线程后自动启动这些任务。线程池线程都是后台线程.每个线程都使用默认的堆栈大小,以默认的优先级运行,并处于多线程单元中.如果某个线程在托管代码中空闲(如正在等待某个事件),则线程池将插入另一个辅助线程来使所有处理器保持繁忙.如果所有线程池线程都始终保持繁忙,但队列中包含挂起的工作,则线程池将在一段时间后创建另一个辅助线程但线程的数目永远不会超过最大值.超过最大值的线程可以排队,但他们要等到其他线程完成后才启动.

Ø 创建一个线程池

线程池的核心数据结构如下:



其中attr描述了线程池的基本属性,包涵了下面一些属性,



线程池的使用包括线程池的各种状态,池中最大,最小的线程数,每个线程维持的作业数,以及池所应用的调度策略等各种属性。

在线程池的使用之前,需要调用ThreadPoolInit对其初始化,整个初始化过程即是填充ThreadPool结构体。主要包括:1:初始化互斥和条件变量;2:设定调度策略;3:初始化FreeList(主要用于存放线程池的空闲节点,其中每个节点为ThreadPoolJob大小,用于存放任务的各个属性);4:初始化线程池的各种统计量;5:初始化高中低作业队列;6:始化其他参数;7:创建一个工作线程。

Ø  线程池如何工作

一个线程池至少要包括4个组成部分,分别为:

1.线程池管理器(ThreadPool):用于创建并管理线程池,包括创建线程池,销毁线程池,添加新任务;

2.工作线程(WorkerThread):线程池中线程,在没有任务时处于等待状态,可以循环的执行任务;

3.任务接口(ThreadPoolJob):每个任务必须实现的接口,以供工作线程调度任务的执行,它主要规定了任务的入口,任务执行完后的收尾工作,任务的执行状态等;

4.任务队列(LinkedList):用于存放没有处理的任务。提供一种缓冲机制。

1)  下面代码主要用于创建一个新的线程池:

 






函数的主要功能是创建一个线程池,初始化线程池的各种属性。如他的调度策略各种状态变量,各种优先级的任务队列等。

2)  创建一个工作线程。

在754行,有个CreateWorker(tp),用于创建一个线程池的工作线程。新创建的线程的入口函数为为WorkerThread,源码如下:











3)  任务接口

ThreadPoolJob规定了任务的接口,工作线程根据ThreadPoolJob的参数来调度工作任务。工作线程首先判断ThreadPoolJob手否是persistentJob,如果是,则调度,否则分别从高中低队列进行调度。代码集中在474-519。

4)  任务队列

   任务队列主要是用于存放没有处理的任务,任务队列通过ThreadWork线程调度。

 

复制搜索

复制搜索
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息