文章目录
- 前提
- 提交的任务有返回值怎么办
- 总结
前提
上一节关于Hipe并发库中动态线程库DynamicThreadPond的一点解读(三)我们分析了以何种方式向线程池提交任务、提交的任务若有参数怎么办,这一节我们分析提交的任务若有返回值怎么办?
提交的任务有返回值怎么办
测试代码如下:
先不要去关注其它地方,只看在example1和example2中都使用了submitForReturn
这个函数,从字面意思也可以理解,这个函数是用来提交带有返回值的任务的。那接下来去分析下这个函数是如何实现的。
代码注释比较清楚了。整体来说就是:将带有返回值的任务包装成一个std::packaged_task对象,然后将这个对象提交给任务队列,使用std::future::get()获取返回值。
再来看example2,从使用形式上来看,它做了一层包装,也就是将很多返回值收集到了一起。来分析下它的代码:
总结
向线程池中提交任务,若提交的任务若有返回值时的处理流程大概就是这样,这里再引出一个问题:**若提交的任务既有参数,又有返回值怎么处理?**上一节分析了任务有参数怎么办,这一节分析了任务有返回值怎么办,那么两个结合起来就可以解决这个问题。如下:
int fun(int x) {
return x++;
}
auto task = std::bind(fun, 5);
auto res1 = pond.submitForReturn(task);
stream.print("return = ", res1.get());
至此,关于Hipe中动态线程池的一些关键点都分析完毕,如下:
- 线程池如何初始化
- 线程池如何提交任务
- 子线程如何执行任务
- 线程池如何动态增加或减少线程
- 线程池关闭时会做什么
- 任务以何种方式提交,任务如果有参数怎么办,任务如果有返回值什么办,任务如果既有参数又有返回值怎么办?
Hipe的动态线程池的代码写的比较易读,而且其中使用到了很多模板的知识。总体来说,无论你是想学习线程池的知识,还是想学习C++编程的知识,这份代码都值得一看 ,慢慢体会吧。
感谢开源。