C++使用pthread实现的线程池PthreadPool

it2025-05-01  8

在学习多线程的时候我们已经知道了像Java、C#这种更高级的语言已经提供了线程池给我们使用,我们也可以直接用就行了。但是在C/C++中,我们却没有一个现成的线程池可以用。

线程池的好处我们也都知道了,我们可以通过线程池对线程资源重用,线程的创建和销毁的开销是巨大的,而通过线程池的重用大大减少了这些不必要的开销。

正好最近在一门课程中需要用到一个发挥线程池作用地方,然而需要用pthread来维护线程,所以就找到了别的博客中的pthread线程池实现,正好学习一下线程池底层的工作原理。

原博客:https://blog.csdn.net/jcjc918/article/details/50395528

原博客中的线程池是纯C语言写的,虽然有面向对象的思想,但是用在我们别的地方代码中还是不太方便,所以我将其改造了一下,使用C++编写,更易于使用。

类定义

class PthreadPool { private: pthread_mutex_t lock; // 互斥锁 pthread_cond_t notify; // 条件变量 queue<Pthreadpool_Runable> thread_queue; // 任务队列 pthread_t *threads; // 任务数组 int shutdown; // 表示线程池是否关闭 static void *threadpool_thread(void *threadpool); // 运行函数 public: PthreadPool(); ~PthreadPool(); int thread_num; // 线程数量 int running_num; // 正在运行的线程数 int waiting_num; // 队列中等待的数目 int Init(unsigned int num); // 初始化线程池 int AddTask(void (*function)(void *), void *argument = nullptr); // 加入任务 int Destory(PthreadPool_Shutdown flag = graceful_shutdown); // 停止正在进行的任务并摧毁线程池 };

对外接口

int Init(unsigned int num); // 初始化线程池 int AddTask(void (*function)(void *), void *argument = nullptr); // 加入任务 int Destory(PthreadPool_Shutdown flag = graceful_shutdown); // 停止正在进行的任务并摧毁线程池

在使用前先创建对象 PthreadPool pool; 然后再初始化线程池 pool.Init(4); 在线程池中加入任务 pool.AddTask(&dummy_task) 在程序结束时销毁线程池 pool.Destory(); 销毁线程池可以提供参数

enum PthreadPool_Shutdown { graceful_shutdown = 1, // 等待线程结束后关闭 immediate_shutdown = 2 // 立即关闭 };

 

源码和注释已经使用方法可以看我GitHub中

https://github.com/JunhuaiYang/PthreadPool

这个只是最简单的线程池,以后还可以增加维护线程的操作,设置核心线程,最大线程数,设置超时、增加定时线程等等。以后有需要可以根据这个简单的轮子改造就可以实现。

 

最新回复(0)