作者:gu油漆装修 | 来源:互联网 | 2024-11-08 11:26
线程池是一种预先创建并维护多个线程的机制,以便在需要时能够快速响应任务请求,避免了频繁创建和销毁线程的开销。本文将详细介绍如何使用C语言在Linux环境中构建一个高效且动态的线程池,以提高系统性能和资源利用率。通过合理的设计和优化,该线程池能够在高并发场景下表现出色,适用于各种服务器端应用。
一:线程池简介
1:什么是线程池
所谓的池概念:都是事先创建好一些事物的集合,在需要使用时,直接调用即可。而不是在需要时才去创建。这里所讲的线程池,其实就是若干个线程的集合,形成的线程池。
2:线程池结构体详解
在该线程池代码中,总共有三种线程,和一个任务池。
任务池:该类的结构体数组。
主线程:负责往任务池中添加任务
工作线程:负责从任务池中取任务执行。
管理者线程:比较当前任务个数与工作线程个数差值,根据差值的大小来调整对工作线程个数。(当然会保留最小线程个数)
二:线程池创建过程
2.1:主线程
1:初始化线程池
这一块主要负责对线程的各种变量进行初始化,这里要注意:子线程的创建一定要在最后,因为在实现线程同步的时候,使用了一些互斥锁和条件变量,如果不先将这些变量初始化完成,当有一个线程被主线程创建出来后,主线程和该子线程的执行顺序是随机的,那么如果该子线程比主线程先执行,贸然使用未初始化的互斥锁和条件变量,可能会造成后续无法解锁,或无法解除条件变量阻塞的状态。(博主之前就犯过这种错误!!!)
2:添加任务进线程池
2.2:工作线程
工作流程:
1;加锁
2:判断任务个数,和线程退出标识,若任务个数为0,阻塞条件变量,等待主线程添加任务解除阻塞,阻塞在此处的线程就是空闲线程(空闲线程太多,会有管理者线程调节线程个数)。
3:判断线程退出标识,为真线程自动退出。
4:判断任务个数,有任务则拿出任务并执行,拿出任务时通知主线程生产。
5:解锁.
6:执行任务时,将忙碌线程个数加一,当忙碌线程个数远小于总线程个数时,管理者线程会通知一部分线程退出。
2.3:管理者线程
比较存活线程个数与任务池的任务个数。任务数量大于线程数量,需要添加线程
任务数量小于线程数量,需要减少线程,当然有先前设定好的最小(最大)线程个数,保证了线程不会无限制减少和增加。
最后附上完整代码路径
server_client: 网络编程第一天