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; // 线程等待超时时间