- 2
- 0
- 约1.16万字
- 约 16页
- 2023-04-26 发布于上海
- 举报
Linux 下设计一个简单的线程池
定义
什么是线程池?简单点说,线程池就是有一堆已经创建好了的线程,初始它们都处于空闲等待状态,当有新的任务需要处理的时候,就从这个池子里面取一个空闲等待的线程来处理该任务,当处理完成了就再次把该线程放回池中,以供后面的任务使用。当池子里的线程全都处理忙碌状态时,线程池中没有可用的空闲等待线程,此时,根据需要选择创建一个新的线程并置入池中,或者通知任务线程池忙,稍后再试。
为什么要用线程池?
我们说,线程的创建和销毁比之进程的创建和销毁是轻量级的,但是当我们的任务需要大量进行大量线程的创建和销毁操作时,这个消耗就会变成的相当大。比如,当你设计一个压力性能测试框架的时候,需要连续产生大量的并发操作,这个是时候,线程池就可以很好的帮上你的忙。线程池的好处就在于线程复用,一个任务处理完成后,当前线程可以直接处理下一个任务,而不是销毁后再创建,非常适用于连续产生大量并发任务的场合。
线程池工作原理
线程池中每一个线程的工作过程如下:
图 1: 线程的工作流程
线程池的任务就在于负责这些线程的创建,销毁和任务处理参数传递、唤醒和等
待。
创建若干线程,置入线程池
任务达到时,从线程池取空闲线程
取得了空闲线程,立即进行任务处理
否则新建一个线程,并置入线程池,执行3
如果创建失败或者线程池已满,根据设计策略选择返回错误或将任务置入处理队列,等待处理
销毁线程池
图 2:线程池的工作原理
线程池设计
数据结构设计
任务设计
view plaincopy to clipboard
? typedef struct tp_work_desc_s TpWorkDesc;
? typedef void (*process_job)(TpWorkDesc*job);
? struct tp_work_desc_s {
? void *ret; //call in, that is arguments
? void *arg; //call out, that is return value
? };
其中,TpWorkDesc 是任务参数描述,arg 是传递给任务的参数,ret 则是任务处理完成后的返回值;
process_job 函数是任务处理函数原型,每个任务处理函数都应该这样定义,然后将它作为参数传给线程池处理,线程池将会选择一个空闲线程通过调用该函数来进行任务处理;
线程设计
view plaincopy to clipboard
? typedef struct tp_thread_info_s TpThreadInfo;
? struct tp_thread_info_s {
? pthread_t thread_id; //thread id num
?? TPBOOL is_busy; //thread status:true-busy;flase-idle
?? pthread_cond_t thread_cond;
?? pthread_mutex_t thread_lock;
?? process_job proc_fun;
?? TpWorkDesc* th_job;
?? TpThreadPool* tp_pool;
?? };
TpThreadInfo 是对一个线程的描述。thread_id 是该线程的ID;
is_busy 用于标识该线程是否正处理忙碌状态; thread_cond 用于任务处理时的唤醒和等待; thread_lock,用于任务加锁(此处保留); proc_fun 是当前任务的回调函数地址;
th_job 是任务的参数信息; tp_pool 是所在线程池的指针;
线程池设计
view plaincopy to clipboard
?? typedef struct tp_thread_pool_s TpThreadPool;
?? struct tp_thread_pool_s {
?? unsigned min_th_num; //min thread number in the pool
?? unsigned cur_th_num; //current thread number in the pool
?? unsigned max_th_num; //max thread number in the pool
?? pthread_mutex_t tp_lock;
?? pthread_t manage_thread_id; //manage thread id num
?? TpThreadInfo* thread_info;
?? Queue idle_q;
?? TPBOOL stop_flag;
?? };
TpThreadPool 是对线程池的描述。
原创力文档

文档评论(0)