LINUX C++ 线程池简单实现之双队列

本文介绍了线程池的工作原理,强调了其在减少线程创建开销和提升系统性能上的优势。接着,详细讲解了线程池的实现,分为线程创建、任务添加、子线程处理和任务反馈四个部分。特别讨论了双队列的使用,以适应非阻塞模式,通过两个队列和互斥锁、条件变量配合,确保任务的顺利执行。
摘要由CSDN通过智能技术生成

1 线程池原理

线程池的原理很简单,就是预先建立些空闲线程,并把它们投入睡眠中。当有任务到达时,就唤醒一个线程来处理,处理完后放回线程池中。因为线程池对空闲线程的维护,所以避免了对线程创建的开销,当频繁使用线程且处理工作量很小的情况下,使用线程池可以有效的提升系统性能。

2 线程池实现

线程池的实现主要分为四部分,线程的创建、添加任务到线程池中、子线程取出任务进行处理以及把执行完成的任务写回主线程。
使用线程池的一般是为了防止主线程阻塞,所以把阻塞的任务(如读写磁盘等)交予子线程处理,实现方式一般分为双队列(同时使用互斥锁和条件变量)和管道两种。
使用双队列的是因为在主线程非阻塞模式下,获取互斥锁时只能用try_lock的方式,从而不一定能获取到互斥锁,所以放任务时需要使用两个队列,当获取不到锁时就放入另一个队列,一个队列的任务执行完后,交换两队列;

3 双队列线程池程序实现:

头文件:


 18 #ifndef __CTHREAD

 19 #define __CTHREAD

 20 

 21 #include<queue>

 22 #include<string>

 23 #include<pthread.h>

 24 #include<iostream>

 25 using namespace std;

 26 

 27

 28 class CTask

 29 {

 30     protected:

 31         string m_strTaskName;

 32         void *m_ptrData;

 33     public:

 34 
    35

 36         CTask(){}

 37 

 38         CTask(string taskName)

 39         {

 40             this->m_strTaskName=taskName;

 41             m_ptrData=NULL;

 42         }

 43         virtual int Run()=0;

 44         void SetData(void *data);  //设置任务数据

 45 

 46 };

 47 

 48

 49 class CThreadPool

 50 {

 51     private:

 52          int m_threadNum;                       //线程数量  

 53 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值