Linux: C实现动态线程池。

一:线程池简介

1:什么是线程池

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

2:线程池结构体详解

Linux: C实现动态线程池。_第1张图片

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

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

Linux: C实现动态线程池。_第2张图片

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

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

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

Linux: C实现动态线程池。_第3张图片

二:线程池创建过程

2.1:主线程

1:初始化线程池

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

2:添加任务进线程池

Linux: C实现动态线程池。_第4张图片

2.2:工作线程 

工作流程:

1;加锁

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

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

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

5:解锁.

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

2.3:管理者线程

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

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

最后附上完整代码路径

server_client: 网络编程第一天

你可能感兴趣的:(1024程序员节,linux)