std::packaged_task与std::async的差别

std::async用于创建异步任务,std::packaged_task则将一个可调用对象(包括函数、函数对象、lambda表达式、std::bind表达式、std::function对象)进行包装,以便该任务能被异步调用(即在其他线程中调用)。二者均可通过std::future对象返回执行结果。二者使用的一个主要差别是:std::packaged_task需要等待执行结果返回,而std::async不必。下面给出一个体现二者差异的示例程序:

#include <functional>
#include <future>
#include <iostream>

int main() {
  //! sleeps for one second and returns 1
  auto sleep = []() {
    std::this_thread::sleep_for(std::chrono::seconds(1));
    return 1;
  };

  //
  // Case 1: packaged_task
  //
  std::packaged_task<int()> task(sleep);
  auto f1 = task.get_future();
  auto start = std::chrono::high_resolution_clock::now();
  task();  // invoke the function
  auto stop = std::chrono::high_resolution_clock::now();

  // You have to wait until task returns. Since task calls sleep
  // you will have to wait at least 1 second.
  std::cout << "You can see this after "
            << std::chrono::duration<double>(stop - start).count()
            << " second\n";
  // However, f.get() will be available, since task has already finished.
  std::cout << f1.get() << std::endl;

  //
  // Case 2: async
  //
  auto f2 = std::async(std::launch::async, sleep);
  std::cout << "You can see this immediately!\n";

  // However, the value of the future will be available after sleep has finished
  // so f.get() can block up to 1 second.
  start = std::chrono::high_resolution_clock::now();
  auto result = f2.get();
  stop = std::chrono::high_resolution_clock::now();
  // you will have to wait at least 1 second.
  std::cout << "You can see " << result << " after "
            << std::chrono::duration<double>(stop - start).count()
            << " second\n";

  return 0;
}

编译指令如下:

g++ -g -Wall -std=c++11 *.cpp -o test

在我机器上的运行结果如下:

You can see this after 1.00027 second
1
You can see this immediately!
You can see 1 after 1.00061 second
  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值