线程池(C++11)
容易理解的,简单一点的线程池系列博客 C++多线程编程(九)——总结篇 - 掘金 (juejin.cn)
----------- 以下内容是不容易理解的,使用了很多c++11新特性的线程池 --------------
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++多线程并行库,附测试!_如何实现跨平台c多线程-CSDN博客
C++11并发学习之六:线程池的实现_c++ createthreadpool-CSDN博客
【尾置返回类型】
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博客
【线程池的设计理念】
轻松掌握C++线程池:从底层原理到高级应用 - 知乎 (zhihu.com)
【任务队列】