【牛客网C++服务器项目学习】Day14-线程池类的封装

项目学习地址:【牛客网C++服务器项目学习】

day14

1.环境配置

不知道有多少小伙伴和我一样,在之前的.c文件中,包含各种头文件进行编写不会产生报错,但是.h头文件中包含头文件就会报告【找不到源文件】的错误。产生错误的原因很简单:没有安装g++编译器。在linux的终端输入命令yum install gcc-c++即可(我的linux用的是centos)

img

  1. 线程池实现

线程池的优势:在传统的服务器开发中,面对一个客户端请求,通常是创建一个线程去处理请求,请求结束之后,销毁线程。也就是我们说的“即时创建,即时销毁”,这对于FTP,SMTP这些需要建立长时间连接,接收和发送数据的客户端请求来说,没有什么问题。但是随着互联网技术的发展,越来越多的短时、高频的连接请求需要得到满足(购物平台、“西安一码通”),过去的这种开发模式不再能满足当下的需求。

对于一个线程,有三个状态:创建、执行、销毁。对应三个时间:T1、T2、T3。要想提高高并发请求的响应速度和效率,势必要降低T1和T3在总时间的占比。线程池技术也就孕育而生了。

线程池技术是当下池化技术的一种,其他的池化技术还有:内存池等等。线程池技术的含义也很好理解,服务器提前创建好一些线程,放在一个“池子”中,当有工作任务到达后,从线程池中取出一个线程分配给当前的工作任务。任务结束后再返回给线程池。

线程池技术的优点有:

  • 提高服务器的响应速度和执行效率
  • 能够减少创建的线程个数。

线程池适用的场合:

  • 单位时间内处理任务频繁而且任务处理时间短
  • 对实时性要求比较高。

线程池的设计:

在服务器的开发设计中,通常需要自己编写一个线程池类。其实一个基本的线程类的设计要点很简单,可以理解为一个被封装的生产者/消费者模型。在设计线程池类的时候,需要掌握以下几点要素:

  • 工作队列:工作队列就是线程池中的线程s。用于存放线程池中的线程s的数据结构可以是队列,也可以是数组链表等。为了简单,可以用一个数组保存线程号记录线程池的线程s

  • 任务队列:任务队列就是线程需要执行的任务——函数。创建线程需要调用pthread_create,这个函数的第三个参数需要传递一个回调函数,在回调函数中线程可以执行对应的任务。因此,我们可以使用一个数据结构:队列、链表、数组存放不同的回调函数吗,让线程去获取内存中存放的函数(资源)。

  • 回调函数:这个其实算是这个线程池类开发的技巧?大家都知道,我们需要在任务函数到来之前创建线程,并将回调函数作为参数传递到pthread_create中去。pthread_create中的回调函数已经无法更改,为了让线程执行不同的函数,能够实现这个需求的办法就是——在回调函数中调用不同的函数!

  • 同步机制:如果你能看到前面的三点,自然而然的就会想到,其实线程池就是创建了一堆线程,然后让线程去访问内存中的资源,这里的资源指的是不同任务对应的函数,同时我们可以通过线程池类的接口,向线程池中添加任务。这不就是典型的生产者和消费者模型吗?只不过我们在编写典型的生产者/消费者模型时,资源时内存中的一个变量/数值,线程池中的资源是一个个函数。多个线程访问同一块资源,势必需要设置线程同步机制,在这里我们可以使用条件变量+互斥锁、信号量。一般都是使用信号量。

其实线程池就是一个典型的生产者/消费者模型,从这个核心点出发,你就能看懂【牛客网—高老师】写的代码,并这其基础上做出自己的修改。网上也有很多用C++实现的线程池,大体思路都是一样的,不过由于C++有很多的奇淫技巧,大佬的代码一时半会可能看不懂。

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值