C++async的使用

引入async的目的是为了简化thread,但局限性挺大

作用:

1、指定未来某个时间段给出结果或做某件事,中间过程并不关心

2、async可以处理计算量非常大,非常复杂的查找

接口:

// async(func, param...);  func:需要去做的事情,param:做事情的参数 
// async(flag, func, param...);	flag:设置需要的时候去做还是需要的时候给出结果,有的时候某件事已经完成再让其去做用flag就多余了,可能还会开一个线程

async底层模式:

1、一种是直接在当前线程下把事情做了,执行func在同一线程跑的
2、另一种执行func可能是个计算量很大的过程,需要开个线程去做
3、第一次调用async可能开了一个线程,当事情做完线程并未结束,当下次调用时会用已经开好这个线程去做事情

缺点:

1、对服务器开发来说其实用得机会并不多
2、结果太单一,并不是很好用

具体使用说明查看C++async官方文档

以下是用async的例子:

其中有以下几点需要注意的地方:

1、用accumulate表示对迭代器beg,end之间的元素加和,迭代器减法对map或list不大适用
2、通过 auto handle = std::async(std::launch::async, parallel_sum, mid, end);语句进行异步操作
3、一定要先执行异步部分再执行同步部分
4、通过handle.get()获得future的值
5、makefile中加入-pthread因为async可能用到线程

使用async具体代码部分:

#include <iostream>
#include <vector>
#include <algorithm>
#include <numeric>
#include <future>
// async(func, param...);
// async(flag, func, param...);

template <typename RAIter> int parallel_sum(RAIter beg, RAIter end) {
  auto len = end - beg;
  if (len < 1000)
    return std::accumulate(beg, end, 0);

  RAIter mid = beg + len / 2;
  auto handle = std::async(std::launch::async, parallel_sum<RAIter>, mid, end);
  int sum = parallel_sum(beg, mid);
  return sum + handle.get();
}

int main() {
  std::vector<int> v(10000, 1);
  std::cout << "The sum is " << parallel_sum(v.begin(), v.end()) << '\n';
}

makefile文件:

main:main.cpp
	g++ -std=c++11 -o main main.cpp -pthread
  • 1
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值