微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

何时使用 std::async 更喜欢 lambda 而非打包任务?

如何解决何时使用 std::async 更喜欢 lambda 而非打包任务?

我有点困惑,因为我什么时候需要将 packaged_task 传递给 std::async。当我可以直接传递带参数的函数时,我真的需要 std::packaged_task 吗? 有什么东西只能用打包的任务而不是普通的函数方法吗?

方法一:std::async with lambda 函数

std::future<int> result= std::async(std::launch::async,[](int m,int n) { return m + n;},2,4));

方法 2:std::async with packaged_task,

        auto f = [](int m,int n) { return m + n;};
        std::packaged_task<int(int,int)> task(f);
        std::future<int> result = task.get_future();
     
        std::async(std::launch::async,std::move(task),4);
        int ans = result.get();
        

我已经检查了答案,但没有一个给我一个正确的用例。看起来编码人员可以只使用这些方法中的任何一种,但是什么时候一个比另一个得分高?

解决方法

不需要std::packaged_task需要std::async

std::packaged_task 在您自己管理线程但仍需要带有 std::future 的可调用包装器时很有用。这意味着拥有通过 std::thread 或其他方式实现的工作线程或线程池。

std::packaged_task 做其他与异步任务相关的事情:

  • std::future 包装结果
  • 在转发时复制参数,而不是通过“通用引用”对它们进行分配
  • 确保仅移动语义而不是可复制(lambda 或 std::function 可以复制,std::packaged_task 不能)

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。