Linux: C实现动态线程池。

一:线程池简介

1:什么是线程池

所谓的池概念:都是事先创建好一些事物的集合,在需要使用时,直接调用即可。而不是在需要时才去创建。这里所讲的线程池,其实就是若干个线程的集合,形成的线程池。

2:线程池结构体详解

在该线程池代码中,总共有三种线程,和一个任务池。

任务池:该类的结构体数组。

主线程:负责往任务池中添加任务

工作线程:负责从任务池中取任务执行。

管理者线程:比较当前任务个数与工作线程个数差值,根据差值的大小来调整对工作线程个数。(当然会保留最小线程个数)

二:线程池创建过程

2.1:主线程

1:初始化线程池

这一块主要负责对线程的各种变量进行初始化,这里要注意:子线程的创建一定要在最后,因为在实现线程同步的时候,使用了一些互斥锁和条件变量,如果不先将这些变量初始化完成,当有一个线程被主线程创建出来后,主线程和该子线程的执行顺序是随机的,那么如果该子线程比主线程先执行,贸然使用未初始化的互斥锁和条件变量,可能会造成后续无法解锁,或无法解除条件变量阻塞的状态。(博主之前就犯过这种错误!!!)

2:添加任务进线程池

2.2:工作线程 

工作流程:

1;加锁

2:判断任务个数,和线程退出标识,若任务个数为0,阻塞条件变量,等待主线程添加任务解除阻塞,阻塞在此处的线程就是空闲线程(空闲线程太多,会有管理者线程调节线程个数)。

3:判断线程退出标识,为真线程自动退出。

4:判断任务个数,有任务则拿出任务并执行,拿出任务时通知主线程生产。

5:解锁.

6:执行任务时,将忙碌线程个数加一,当忙碌线程个数远小于总线程个数时,管理者线程会通知一部分线程退出。

2.3:管理者线程

比较存活线程个数与任务池的任务个数。任务数量大于线程数量,需要添加线程

任务数量小于线程数量,需要减少线程,当然有先前设定好的最小(最大)线程个数,保证了线程不会无限制减少和增加。

最后附上完整代码路径

server_client: 网络编程第一天

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值