CPP11线程池
前言
C++11新添加了多线程库,但是却没有线程池,而且线程功能不完整.没有线程终止,状态判断等函数.当然C++委员会有自己的考虑.比如线程突然终止资源泄漏或内存泄漏问题.利用C++ thread实现线程池还是有一定难度的.这里参考Java的Executor和C++并发编程实战.真正的代码比较长,放在了github上.线程池代码地址
要实现的组件
- Runnable类,可以通过重载operator()执行任务
- Thread类,封装std::thread,提供命名join()等操作
- BlockingQueue存储任务
- ThreadPoolExecutor基本线程池(自动调整大小)
- workStealingThreadPool任务窃取线程池(未完成)
- ScheduledThreadPool定时调度线程池(未完成)
例子
#include <iostream>
#include <chrono>
#include "runnable.hpp"
#include "threadpool.hpp"
class R: public Runnable {
public:
virtual void operator()() {
std::this_thread::sleep_for(std::chrono::seconds(2));
std::cout << name << std::this_thread::get_id() << std::endl;
}
private:
std::string name = "RRRRRRRRRRRRRRRRRRRRR";
};
int main(void)
{
R r1, r2;
ThreadPoolExecutor tpe(1, 5);
for (int i = 0; i < 1; ++i) {
//submit可以有返回值(std::future)
tpe.submit(r1);
tpe.submit([]() {
std::this_thread::sleep_for(std::chrono::seconds(2));
std::cout << std::this_thread::get_id() << std::endl;
});
}
//std::this_thread::sleep_for(std::chrono::seconds(1));
tpe.releaseIdleWorkers();
//std::this_thread::sleep_for(std::chrono::seconds(1));
tpe.submit([]() {
std::this_thread::sleep_for(std::chrono::seconds(2));
std::cout << std::this_thread::get_id() << std::endl;
});
//tpe.stop();
std::this_thread::sleep_for(std::chrono::seconds(3));
std::cout << tpe.toString() << std::endl;
return 0;
}
源码截图
源码地址
https://github.com/yzz-ihep/CXX11ThreadPool
代码会不定期更新