LINUX线程池

LINUX线程池

一、线程池是什么?为什么要使用线程池?

通俗的来说,线程池是一种线程的使用与封装模式。

·  传统的服务器模型中,很多采用的都是客户端连接后,客户端发送请求,服务器开辟线程处理请求,线程内处理业务逻辑,线程退出。即“即时创建、即时销毁。” 。对于只有若干个客户端请求,处理业务体量较小的服务器来说,这是一种简单而又不会特别浪费资源的模型。
  但是,如果提交给线程的任务是执行时间较短,而且执行次数极其频繁,那么服务器将处于不停的创建线程,销毁线程的状态。这一模型显然非常不合理,开辟与退出线程都需要时间与开销。
  举个例子来比喻一下这个情景:拥有一家店(服务器),来一个客人(客户端的请求)就临时招募一个员工(线程)给他服务,同时来10W个客人就招聘10W个员工,客人一走就把员工直接炒了。

所以,这时候就需要线程池

·  提前招募好一定数量的员工作为员工团队(线程池),来10个人(客户端)是这个团队服务,来10W个人也是这个团队服务。如果数量超过员工数目(客户端请求数目超过线程池内线程数),就招临时工来应对,当员工够用时,再把临时工辞退。

·  即预先开辟一定数量的线程放入定义好的空闲队列,这些线程都是处于阻塞(Suspended)状态,不消耗CPU,占用较小的内存空间。当客户端发送请求时,线程池内的空闲线程处理该请求,进入忙碌队列,处理完请求后回到空闲队列等待请求;当线程池内已经没有空闲线程,则额外开辟新的线程处理任务队列中的任务。当大于预先设置好的线程数目时,再根据任务队列-空闲队列-忙碌队列三者的比例,销毁一定数量线程(使数目往预先数目接近)。
  这边的队列指的是容器。

线程池的优点:

1、减少了创建线程的个数。
2、减少了在处理短时间任务时创建与销毁线程的代价。
3、线程池不仅能够保证内核充分利用,还能防止过分调度。

二、线程池框架

·线程池由以下几个部分组成:
1、线程池管理器(CThreadManager):创建并管理线程池,直接与客户端对接。
2、任务接口:抽象化的线程任务,需要有通用性。
3、任务队列-空闲队列-忙碌队列:具体的数据容器(向量、链表、队列等),用于存放任务与线程。

  • 线程池中的多个线程负责从任务队列当中拿任务,并将拿到的任务进行处理。

具体组件

CJob

class CJob {//所有任务的基类
protected:
    char *jobName;//任务名
    char *data;//任务具体数据
public:
    CJob();
    CJob(char *jobname);
    void setData(const char *data);
    virtual int Run() = 0;//子类实现的业务具体处理逻辑
};

CWorkJob

#include "CJob.h"
//继承CJob,具体的要做的任务在这编逻辑
class CWorkJob :
        public CJob{
public:
    CWorkJob();
    CWorkJob(char *jobname);
    int Run() override;//具体逻辑
};
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值