C++11 动态线程池,异步执行器---150行代码

C++11 线程池只需要100行代码,任务类型可以是带任意参数个数  的 函数,够炫酷么

github 原代码在此,只需要一个头文件(模板也只能在同一个文件里面实现)

https://github.com/progschj/ThreadPool

我将其进行了改造,增加了线程内的超时处理,支持动态线程池,下面三种模式,只需要你构造子类的时候传入参数即可实现
1. 可设定为   单线程,则是一个异步执行器,
2. 也可以固定线程数量,
3. 亦可动态增减线程数量 (空任务超时时减少线程数,任务数量大于空闲线程数量时增加线程数)
代码丑了点,效果那是非常不错的~~~~~,

最精彩的部分在下面这里,当第三个参数为  否  时,等待第二个参数的时间那么长,这一句的再往下,即可以判断是超时还是有任务

  this->cv_task.wait_for(lock, std::chrono::seconds(timeOut),
	   [this] { return this->stopped.load() || !this->tasks.empty(); });

详情请看注释


基类

WorkerManager.h


#pragma once  
#include <vector>  
#include <queue>  
#include <thread>  
#include <atomic>  
#include <condition_variable>  
#include <future>  

class WorkerManager
{
private:
	std::vector<std::thread>            pool;          // 线程池  
	std::mutex                          m_pool_lock;   // 线程池锁 
	std::queue< std::function<void()> > tasks;         // 任务队列    
	std::mutex                          m_task_lock;   // 任务队列锁  
	std::condition_variable             cv_task;       // 条件变量,阻塞线程用      
	std::atomic<bool>                   stopped;       // 停止标签  

	std::atomic<int>                    timeOut;       // 线程等待超时时间
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值