关于Hipe并发库中动态线程库DynamicThreadPond的一点解读(四)

前提

上一节关于Hipe并发库中动态线程库DynamicThreadPond的一点解读(三)我们分析了以何种方式向线程池提交任务提交的任务若有参数怎么办,这一节我们分析提交的任务若有返回值怎么办?

提交的任务有返回值怎么办

测试代码如下:
请添加图片描述
先不要去关注其它地方,只看在example1example2中都使用了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中动态线程池的一些关键点都分析完毕,如下:

  1. 线程池如何初始化
  2. 线程池如何提交任务
  3. 子线程如何执行任务
  4. 线程池如何动态增加或减少线程
  5. 线程池关闭时会做什么
  6. 任务以何种方式提交,任务如果有参数怎么办,任务如果有返回值什么办,任务如果既有参数又有返回值怎么办?

Hipe的动态线程池的代码写的比较易读,而且其中使用到了很多模板的知识。总体来说,无论你是想学习线程池的知识,还是想学习C++编程的知识,这份代码都值得一看 ,慢慢体会吧。

感谢开源。

  • 7
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值