线程池复习

手写线程池 - C语言版 | 爱编程的大丙 (subingwen.cn)

线程池主要采用生产者消费者模型,分为三部分 任务队列 工作的线程 (工作的线程有很多个) 管理者线程(一个)

首先是自定义线程池结构体其中包括了最大最小线程数 存活的线程数 忙碌的线程数 线程池的关闭状态 需要等待关闭的线程数 任务队列所能容纳的最大任务数 当前队列的任务数 任务队列的头尾指针用来添加和拿取任务 初始化两个条件变量和一个锁 初始化工作线程数组和任务队列

创建线程池 先创建最小数量的工作线程

生产者添加任务 首先上锁

如果任务队列已满 就用pthread cond wait 等待任务队列有空余的地方 将任务添加到任务队列 用头指针 添加完任务就会更新头指针 使头指针指向的位置加一 这里用到了循环队列 指针加一 并且对任务队列的容量取余 这样即使指针指到最后还能走回到第一个位置 添加完任务就用条件变量 pthread cond signal 通知消费者线程有新的任务可以取 并解锁

。。。。。

加锁的目的是整个线程池共用一个任务队列

1. 线程池原理
我们使用线程的时候就去创建一个线程,这样实现起来非常简便,但是就会有一个问题:如果并发的线程数量很多,并且每个线程都是执行一个时间很短的任务就结束了,这样频繁创建线程就会大大降低系统的效率,因为频繁创建线程和销毁线程需要时间。

那么有没有一种办法使得线程可以复用,就是执行完一个任务,并不被销毁,而是可以继续执行其他的任务呢?

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

在各个编程语言的语种中都有线程池的概念,并且很多语言中直接提供了线程池,作为程序猿直接使用就可以了,下面给大家介绍一下线程池的实现原理:

条件变量:

唤醒:

管理者线程:

 如果任务队列的任务数量大于当前存活的空闲线程数,或者忙碌的线程占比存活的线程80%,并且存活的任务数小于最大的线程数就添加一些线程

添加线程的时候工作线程数组中查找 该进程数组下下进程不存在的 就在这个id下面创建新的工作线程

忙碌的线程小于存活的线程三分之一 存活的线程数大于最小线程数 就将需要关闭的线程数设置为默认值 并通知给工作线程的条件变量 让他去执行杀死线程的工作

  • 3
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值