已经有现成的实现,本博客摘抄讲解附源码链接。参考的博客质量已经非常高,避免找来找去。
1、避免频繁创建、销毁线程,实现复用。思路如下:
2、线程函数多种多样,如何封装成统一的函数类型 void( )
第一次封装我们使用bind()函数将多个参数的函数封装为没有形参的package_task对象,因为package_task对象可以通过get_future得到future对象,future对象可以通过get方法获取返回值
【参考】
先看这个,容易理解源码 c++ 11 线程池---完全使用c++ 11新特性 - MicroDeLe - 博客园 (cnblogs.com)
源码及讲解 GitHub - xyygudu/ThreadPool: threadpool
以上两个链接,不好的地方是线程是detach的,不是join的。但是用于学习c++11新特性,足够了。
【尾置返回类型】
c++11的新特性,使用auto
关键字和decltype
来指定返回类型。注意VS2015对decltype有时会报错,VS2019没问题
格式:auto 函数() -> 函数返回类型
在模板编程中使用,如线程池
template<class F, class... Args> auto enqueue(F&& f, Args&&... args) -> std::future<typename std::result_of<F(Args...)>::type> { using return_type = typename std::result_of<F(Args...)>::type; auto task = std::make_shared< std::packaged_task<return_type()> >( std::bind(std::forward<F>(f), std::forward<Args>(args)...) ); std::future<return_type> res = task->get_future(); { std::unique_lock<std::mutex> lock(queueMutex); // don't allow enqueueing after stopping the pool if (stop) throw std::runtime_error("enqueue on stopped ThreadPool"); tasks.emplace([task]() { (*task)(); }); } condition.notify_one(); return res; }
参考 C++ 新特性 | C++ 11 | 尾置返回类型-CSDN博客
标签:11,std,task,auto,C++,future,线程 From: https://www.cnblogs.com/xixixing/p/18312364