线程池,顾名思义就是预先启动一些线程,集中管理,需要的时候直接拿来用,无需用时再创建。尤其是在
Windows
平台,线程是稀缺资源,线程的创建和销毁都是十分耗时的,所以利用线程池来提升并发场景下的性能,是十分有必要的。
C++11
首次对并发进行了支持,这使得我们利用STL
编写多线程应用程序成为了可能,不过STL
的thread
比较简陋,并没有提供更多的强大特性,只是一个最基础的多线程解决方案,定位应该是尽可能面向更多应用场景的最通用的版本。
先上代码:Thread Pool
为了拥抱新标准,尽量使用了C++14/17的特性,所以如果需要编译运行这些代码的话,需要启用你的编译器的c++17
特性。
本文不对thread
,mutex
,condition_variable
作过多解释,不知道的同学可以去查阅相关资料 ——> cpp_reference。
首先我们定义设计ThreadPool
这个类的接口:
class ThreadPool {
public:
explicit ThreadPool(const size_t& max_threads);
template<class Func, typename... Args>
decltype(auto) submitTask(Func&& func, Args&&... args);
void pause();
void unpause();
void close();
bool isClosed() const;
~ThreadPool();
protected:
void _scheduler();
void _launchNew();
private:
static size_t core_thread_count;
size_t max_thread_count;
// thread-manager
std::vector<std::thread> threads;
// tasks-queue
std::queue<std::function<void()>> tasks;
// for synchronization